Action<int, string> s = new Action<int, string>(delegate(int a,string b){});
Action<int, string> ss = delegate(int a, string b) { };
为什么这两个都有效?为什么构造函数Action可以接受函数和 委托方?
答案 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>
委托。在第二个 - 隐含地。