匿名匿名方法未授权?

问题描述:

我尝试创建这样一个电话,这在javascript效果很好:匿名匿名方法未授权?

service.DoAction(new { param1="sometext", onOk=() => { Console.WriteLine("ok"); }}); 

,但它并没有错误编译:

Can not assign 'anonymous method' to anonymous type property

Can not assign 'lambda expression' to anonymous type property

知道为什么这是不是授权?语言限制?

+4

看来,正确的类型不能在这里推断。当你做'OnOk =新的行动(()=> {})',它的作品。 –

你可以这样做:

var test = new { hi = "Hi!", doSomething = (Action)(() => { Console.WriteLine("Done!"); }) }; 
test.doSomething(); 

.NET本身绝对不关心 - 匿名类型和方法汇编成“真正”的类型和方法,无论如何,所以没有区别。请注意,本示例中的doSomething本身不是一种方法,它只是对方法的引用(驻留在它自己的匿名类型中)。所以你不能使用this

所以; C#不允许你创建完整的匿名类型(比如Java) - 你不能创建一个实现一个接口的类型,并且具有方法(在属性之外,为内部方法+)。这是一种解决方法,它将对匿名方法的引用分配给匿名类型的自动属性,并且必须具体化类型,因为() => {}可以表示一堆不同类型,并且编译器必须知道一种特定类型。

lambda的想法是,它无法知道代表匿名方法的代表的类型,而不使用上下文。它需要分配给具有已知委托类型的事物,以便可以推断委托的类型。

匿名类型属性还需要从您分配给它的内容中推断出它的类型。他们每个人都试图从彼此中推断出这种类型,并且从未在任何地方指定过。

你需要明确指出的委托类型来使用它来编译:

var foo = new 
{ 
    hi = "Hi!", 
    doSomething = new Action(() => Console.WriteLine("Done!")) 
};