Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我可以将不兼容的lambda分配给操作?_C#_Lambda_Action - Fatal编程技术网

C# 为什么我可以将不兼容的lambda分配给操作?

C# 为什么我可以将不兼容的lambda分配给操作?,c#,lambda,action,C#,Lambda,Action,我不明白为什么会这样: Action myAction1 = () => myIntFunc(); ... private Int32 myIntFunc() { return(4); } 我希望编译器不允许这样做,因为动作表示不返回参数的函数,而myIntFunc显然返回参数 作为进一步的证据,请注意这不起作用: Action myAction2 = myIntFunc; 这就像lambda语法让我逃脱了我不该逃脱的惩罚。我猜我忽略了一些与动作和lambda如何协同

我不明白为什么会这样:

Action myAction1 = () => myIntFunc(); 
...
private Int32 myIntFunc() {
    return(4);
    }
我希望编译器不允许这样做,因为动作表示不返回参数的函数,而myIntFunc显然返回参数

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

Action myAction2 = myIntFunc;

这就像lambda语法让我逃脱了我不该逃脱的惩罚。我猜我忽略了一些与动作和lambda如何协同工作有关的东西…?

我认为这和你这样做时是一样的:

myIntFunc();

忽略方法的结果。

明确允许您尝试执行的操作。根据学员的MSDN文档(增加了重点):

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

在第6.5段中,其中一个项目符号表示:如果D具有无效返回类型且F的主体是一个表达式,则当F的每个参数都给定了D中相应参数的类型时,F的主体是一个有效表达式(wrt§7),可以作为语句表达式(§8.6)

因此,在这种情况下,可以丢弃返回值

有关方法组转换,请参见第6.6段。然后该方法必须兼容,包括返回类型

所以,匿名方法(lambda)和普通(命名)方法(或方法组)之间存在差异