【问题标题】:Why can I assign incompatible lambda to Action?为什么我可以将不兼容的 lambda 分配给 Action?
【发布时间】:2012-08-14 17:58:50
【问题描述】:

我很困惑为什么会这样:

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

我希望编译器不允许这样做,因为 Action 表示不返回参数的函数,而 myIntFunc 显然返回参数。

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

Action myAction2 = myIntFunc;

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

【问题讨论】:

    标签: c# lambda action


    【解决方案1】:

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

    myIntFunc();
    

    忽略方法的结果。

    【讨论】:

      【解决方案2】:

      您尝试做的事情是明确允许的。根据 Action 代表的 MSDN 文档(已添加重点):

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

      【讨论】:

        【解决方案3】:

        C# language specification,第 6.5 段中,其中一个项目符号说:如果 D 有一个 void 返回类型并且 F 的主体是一个表达式,那么当 F 的每个参数被赋予相应参数的类型时在 D 中,F 的主体是一个有效的表达式(wrt §7),可以作为语句表达式(§8.6)。

        所以这种情况下把返回值扔掉就OK了。

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

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

        【讨论】:

          猜你喜欢
          • 2017-07-20
          • 2015-07-31
          • 1970-01-01
          • 1970-01-01
          • 2012-07-25
          • 2014-07-08
          • 1970-01-01
          • 2019-07-04
          相关资源
          最近更新 更多