匿名匿名方法未授权?
问题描述:
我尝试创建这样一个电话,这在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
知道为什么这是不是授权?语言限制?
答
你可以这样做:
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!"))
};
看来,正确的类型不能在这里推断。当你做'OnOk =新的行动(()=> {})',它的作品。 –