我很困惑为什么会这样:
Action myAction1 = () => myIntFunc();
...
private Int32 myIntFunc() {
return(4);
}
我希望编译器不允许这样做,因为Action表示不返回参数的函数,但myIntFunc清楚地返回一个参数。
作为进一步的证据,请注意这不起作用:
Action myAction2 = myIntFunc;
所以就像lambda语法让我逃脱了一些我无法逃避的东西。我猜我忽略了与Actions和lambdas如何协同工作有关... ??
答案 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)和普通(命名)方法(或方法组)之间存在差异。