Lambda转换具有不明确的返回类型和重载决策
如果我有一个lambda,如() => { throw new Exception(); }
() => { throw new Exception(); }
,目前还不清楚它是否有返回类型。 因此,它可以(隐式)转换为Action
和Func
(或任何其他Func
)。 这是因为,根据§6.5C#4规范的匿名函数转换 :
[A]委托类型
D
与提供的匿名函数F
兼容:
…
如果
D
具有void
返回类型且F
的主体是语句块,则当F
的主体是有效语句块时,其中没有return语句指定表达式。如果
D
具有非void返回类型且F
的主体是语句块,则当F
的主体是具有不可到达端点的有效语句块时,其中每个return
语句指定隐式表达式可转换为D
的返回类型。
但是如果我有一个方法的两个重载,其中一个具有Action
类型的参数而另一个具有Func
,并且我从上面传递lambda,则使用Func
重载。 为什么? 规范的哪一部分说在这种情况下Func
比Action
更好?
我已经看过§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
或表达式树类型Expression
,1 > T 2
是委托类型D 2
或表达式树类型Expression
以及以下之一认为:2 >
…
D 1
和D 2
具有相同的参数列表,并且具有以下之一:
…
D 1
具有返回类型Y
,并且D 2
返回空白