为什么我可以将不兼容的lambda分配给Action?

时间:2012-08-14 17:58:50

标签: c# lambda action

我很困惑为什么会这样:

Action myAction1 = () => myIntFunc(); 
...
private Int32 myIntFunc() {
    return(4);
    }

我希望编译器不允许这样做,因为Action表示不返回参数的函数,但myIntFunc清楚地返回一个参数。

作为进一步的证据,请注意这不起作用:

Action myAction2 = myIntFunc;

所以就像lambda语法让我逃脱了一些我无法逃避的东西。我猜我忽略了与Actions和lambdas如何协同工作有关... ??

3 个答案:

答案 0 :(得分:2)

我认为它与你这样做时相同:

myIntFunc();

忽略方法的结果。

答案 1 :(得分:1)

明确允许您尝试做的事情。根据{{​​3}}代表的MSDN文档(强调添加):

  

封装的方法必须没有参数且没有返回值。 (在C#中,该方法必须返回void。[...] 它也可以是一个返回忽略值的方法。

答案 2 :(得分:0)

C# language specification第6.5段中,其中一个项目符号表示:如果D具有void返回类型且F的主体是表达式,则当给出F的每个参数时,其类型为在D中的相应参数中,F的主体是一个有效的表达式(wrt§7),它将被允许作为语句表达式(§8.6)。

所以在那种情况下扔掉返回值是可以的。

对于方法组转换,请参阅第6.6节。然后该方法必须兼容包括返回类型。

因此匿名方法(lambda)和普通(命名)方法(或方法组)之间存在差异。