为什么匿名方法可以传递给委托人的构造函数?

时间:2015-03-04 10:39:46

标签: c# delegates

Action<int, string> s = new Action<int, string>(delegate(int a,string b){});
Action<int, string> ss = delegate(int a, string b) { };

为什么这两个都有效?为什么构造函数Action可以接受函数和 委托方?

2 个答案:

答案 0 :(得分:4)

你不是真的以正常的方式进行构造函数调用,即使它看起来像是这样。

相反,这是 delegate-creation-expression ,如C#5规范第7.6.10.5节所述:

  

delegate-creation-expression 用于创建委托类型的新实例。

delegate-creation-expression:
    new   delegate-type   (   expression   )
     

委托创建表达式的参数必须是方法组,匿名函数或编译时类型动态或委托类型的值。

使用从匿名函数(lambda表达式或匿名方法)到兼容委托类型的隐式转换几乎总是更简单,这是您的第二行所做的。

如果你还记得回到C#1,这就是我们 创建委托实例的方式,尽管使用方法组:

Action action = new Action(SomeMethod);

C#2引入了匿名方法以及从方法组到委托的隐式转换:

Action action = SomeMethod;

目前,委托创建表达式相对较少,因为有更简洁的方法可以做同样的事情。

请注意,在某些情况下 - 例如,如果您将匿名函数或方法组作为类型Delegate的参数的参数传递 - 您可以转换而不是使用委托创建表达式:< / p>

Foo((Action<int, string>) delegate(int a, string b) {});

答案 1 :(得分:1)

在第一行中,您明确地创建了匿名方法的Action<int, string>委托。在第二个 - 隐含地。