如果我有一个像() => { throw new Exception(); }
这样的lambda,则不清楚它是否有返回类型。因此,它可以(隐式)转换为Action
和Func<object>
(或任何其他Func<T>
)。这是因为,根据C#4规范的§6.5匿名函数转换:
[A]委托类型
D
与提供的匿名函数F
兼容:
...
如果
D
的回复类型为void
且F
的正文为语句块,则F
的正文有效时语句块,其中没有return语句指定表达式。如果
D
具有非void返回类型且F
的主体是语句块,则[{1]的主体是F
的有效语句块具有不可到达的终点,其中每个return
语句指定一个可隐式转换为返回类型D
的表达式。
但是如果我有一个方法的两个重载,其中一个参数类型为Action
而另一个Func<object>
,我从上面传递lambda,Func<object>
重载用来。为什么?在这种情况下,哪一部分说明Func<object>
优于Action
?
我已经看过§7.5.3.2更好的功能成员,但这并没有解释它。
答案 0 :(得分:11)
我应该看一个较低的部分:§7.5.3.3从表达式更好的转换解释了:
给定从表达式
C1
转换为类型E
的隐式转换T1
,以及从表达式C2
转换的隐式转换E
对于T2
类型,C1
如果至少满足下列条件之一,则转化率优于C2
:
...
E
是一个匿名函数,T1
是委托类型D1
或表达式树类型Expression<D1>
,T2
是一个委托类型D2
或表达式树类型Expression<D2>
,其中一个成立:
...
D1
和D2
具有相同的参数列表,其中一个包含:
...
D1
的返回类型为Y
,D2
无效返回