我尝试创建一个这样的调用,在javascript中运行良好:
service.DoAction(new { param1="sometext", onOk= () => { Console.WriteLine("ok"); }});
但它没有编译错误:
无法指定匿名方法'匿名类型属性
或
无法分配' lambda表达式'匿名类型属性
知道为什么没有授权吗?语言限制?
答案 0 :(得分:6)
lambda的想法是它无法知道代表没有上下文的匿名方法的委托的类型。需要将其分配给具有已知委托类型的内容,以便可以推断出委托的类型。
匿名类型属性还需要根据您分配的类型推断其类型。他们每个人都试图从彼此推断出这种类型,并且它从未在任何地方指定过。
您需要明确指出要用于编译的委托类型:
var foo = new
{
hi = "Hi!",
doSomething = new Action(() => Console.WriteLine("Done!"))
};
答案 1 :(得分:0)
你可以这样做:
var test = new { hi = "Hi!", doSomething = (Action)(() => { Console.WriteLine("Done!"); }) };
test.doSomething();
.NET本身绝对不关心 - 无论如何,匿名类型和方法被编译成“真实”类型和方法,因此没有区别。请注意,此示例中的doSomething
本身不是一个方法,它只是对方法的引用(它驻留在它自己的匿名类型中)。所以你不能使用this
。
因此; C#不允许您创建完整的匿名类型(如Java所做的) - 您不能创建实现接口的类型并且具有方法(在属性之外, 方法+内部)。这是一种解决方法,它将匿名方法的引用分配给匿名类型的自动属性,并且您必须具体化类型,因为() => {}
可能意味着一堆不同的类型,并且编译器必须知道一种特定的类型。