2

我对为什么会这样感到困惑:

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

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

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

Action myAction2 = myIntFunc;

所以这就像是 lambda 语法让我摆脱了一些我不应该摆脱的东西。我猜我忽略了与 Actions 和 lambdas 如何协同工作有关的事情......??

4

3 回答 3

2

我认为它与您执行此操作时相同:

myIntFunc();

忽略方法的结果。

于 2012-08-14T18:01:19.670 回答
1

您正在尝试做的事情是明确允许的。根据Action委托的 MSDN 文档(强调添加):

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

于 2012-08-14T18:08:43.333 回答
0

C# 语言规范第 6.5 段中,其中一个项目符号说:如果 D 具有 void 返回类型并且 F 的主体是表达式,则当 F 的每个参数被赋予 D 中相应参数的类型时,主体F 是允许作为语句表达式(第 8.6 节)的有效表达式(wrt §7)。

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

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

所以匿名方法(lambda)和普通(命名)方法(或方法组)是有区别的。

于 2012-08-14T18:21:46.937 回答