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)和普通(命名)方法(或方法组)之间存在差异