Lambda转换具有不明确的返回类型和重载决策

如果我有一个lambda,如() => { throw new Exception(); } () => { throw new Exception(); } ,目前还不清楚它是否有返回类型。 因此,它可以(隐式)转换为ActionFunc (或任何其他Func )。 这是因为,根据§6.5C#4规范的匿名函数转换

[A]委托类型D与提供的匿名函数F兼容:

  • 如果D具有void返回类型且F的主体是语句块,则当F的主体是有效语句块时,其中没有return语句指定表达式。

  • 如果D具有非void返回类型且F的主体是语句块,则当F的主体是具有不可到达端点的有效语句块时,其中每个return语句指定隐式表达式可转换为D的返回类型。

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

我已经看过§7.5.3.2 更好的函数成员 ,但这并没有解释它。

我应该看一个较低的部分:§7.5.3.3 从表达式转换更好解释了:

给定从表达式E转换为类型T 1的隐式转换C 2 T 1 ,以及从表达式E转换为类型T 2的隐式转换C 2 ,如果至少其中一个,则C 1是比C 2更好的转换。以下是:

  • E是匿名函数, T 1是委托类型D 1或表达式树类型Expression1 >T 2是委托类型D 2或表达式树类型Expression2 >以及以下之一认为:

    • D 1D 2具有相同的参数列表,并且具有以下之一:

      • D 1具有返回类型Y ,并且D 2返回空白