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

时间:2012-08-13 20:27:04

标签: c# lambda overload-resolution

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

  

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

     
      
  • ...

  •   
  • 如果D的回复类型为voidF的正文为语句块,则F的正文有效时语句块,其中没有return语句指定表达式。

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

  •   

但是如果我有一个方法的两个重载,其中一个参数类型为Action而另一个Func<object>,我从上面传递lambda,Func<object>重载用来。为什么?在这种情况下,哪一部分说明Func<object>优于Action

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

1 个答案:

答案 0 :(得分:11)

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

  

给定从表达式C1转换为类型E的隐式转换T1,以及从表达式C2转换的隐式转换E对于T2类型,C1如果至少满足下列条件之一,则转化率优于C2

     
      
  • ...

  •   
  • E是一个匿名函数,T1是委托类型D1或表达式树类型Expression<D1>T2是一个委托类型D2或表达式树类型Expression<D2>,其中一个成立:

         
        
    • ...

    •   
    • D1D2具有相同的参数列表,其中一个包含:

           
          
      • ...

      •   
      • D1的返回类型为YD2无效返回

      •   
    •   
  •