如果我有一个 lambda () => { throw new Exception(); }
,则不清楚它是否有返回类型。因此,它可以(隐式)转换为Action
and Func<object>
(或任何其他Func<T>
)。这是因为,根据C# 4 规范的§6.5匿名函数转换:
[A] 委托类型
D
与提供的匿名函数兼容F
:
…</p>
如果
D
有一个void
返回类型并且主体F
是一个语句块,当 [...] 主体F
是一个有效的语句块,其中没有返回语句指定一个表达式。如果
D
具有非 void 返回类型并且主体F
是语句块,则当 [...] 主体F
是具有不可到达终点的有效语句块时,其中每个return
语句都指定一个可隐式转换为返回的表达式的类型D
。
但是,如果我有一个方法的两个重载,其中一个有一个类型的参数,另一个有一个类型的参数Action
,Func<object>
并且我从上面将 lambda 传递给它,Func<object>
则使用重载。为什么?规范的哪一部分说这Func<object>
比Action
这种情况更好?
我看过 §7.5.3.2 Better function member,但这并没有解释它。