匿名类型的匿名方法未经授权?

时间:2014-01-09 15:33:25

标签: c#

我尝试创建一个这样的调用,在javascript中运行良好:

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

但它没有编译错误:

  

无法指定匿名方法'匿名类型属性

  

无法分配' lambda表达式'匿名类型属性

知道为什么没有授权吗?语言限制?

2 个答案:

答案 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所做的) - 您不能创建实现接口的类型并且具有方法(在属性之外, 方法+内部)。这是一种解决方法,它将匿名方法的引用分配给匿名类型的自动属性,并且您必须具体化类型,因为() => {}可能意味着一堆不同的类型,并且编译器必须知道一种特定的类型。