如果我有一个 lambda () => { throw new Exception(); },则不清楚它是否有返回类型。因此,它可以(隐式)转换为Actionand 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,但这并没有解释它。