10

如果我有一个 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

但是,如果我有一个方法的两个重载,其中一个有一个类型的参数,另一个有一个类型的参数ActionFunc<object>并且我从上面将 lambda 传递给它,Func<object>则使用重载。为什么?规范的哪一部分说这Func<object>Action这种情况更好?

我看过 §7.5.3.2 Better function member,但这并没有解释它。

4

1 回答 1

11

我应该看低一节:§7.5.3.3 Better conversion from expression解释说:

给定从 expression 转换为 type 的隐式转换,以及从 expression转换为 type的隐式转换,是比以下至少一项成立时更好的转换:C1ET1C2ET2C1C2

  • …</p>

  • E是一个匿名函数,是委托类型或表达式树类型,是委托类型或表达式树类型,并且满足以下条件之一:T1D1Expression<D1>T2D2Expression<D2>

    • …</p>

    • D1并具有相同的参数列表,并且满足以下条件之一:D2

      • …</p>

      • D1有返回类型Y,并且返回无效D2

于 2012-08-13T20:27:03.670 回答