为什么在C#7.2及更低版本中此方法组转换模棱两可?

时间:2018-11-20 18:21:35

标签: c# visual-studio-2017 c#-7.0 c#-7.2 c#-7.1

提供以下课程:

public class Foo {
    public Foo(int i, double d) {
        Integer = i;
        Double = d;
    }
    public int Integer {get;}
    public double Double {get;}

    private static Random rand = new Random();
    public static Foo CreateRandom() => new Foo(rand.Next(1,101), rand.NextDouble());
}

用法以及

void Main()
{
    var items = Enumerable.Range(0, 50)
                          .Select(_ => Foo.CreateRandom());

    Console.WriteLine(items.Sum(GetInteger)); // Fine
    Console.WriteLine(items.Sum(GetDouble)); // Ambiguous
    Console.WriteLine(items.Sum(x => x.Double)); // Also fine
    Console.WriteLine(items.Sum((Func<Foo,double>)GetDouble)); // Cast required? Why?

    int GetInteger(Foo item) => item.Integer;
    double GetDouble(Foo item) => item.Double;
}

我试图弄清为什么GetDouble委托转换被认为是模棱两可的,以及在这种情况下,它与labmda表达式和强制转换为匿名委托的区别到底是什么。

编辑: 看起来这不会影响C#7.3,但是会影响7.2及更低版本。通过将GetInteger和GetDouble设置为静态,可以影响添加本地方法之前的版本。

1 个答案:

答案 0 :(得分:5)

C#7.3的新功能

  

对现有功能进行了以下增强:

     
      
  • 您可以使用元组类型测试==和!=。
  •   
  • 您可以在更多位置使用表达式变量。
  •   
  • 您可以将属性附加到自动实现属性的后备字段。
  •   
  • 改进了当参数不同时的方法分辨率。
  •   
  • 重载解决方案现在具有更少的歧义情况。
  •   

最后一个解决方法是针对此问题。在此之前,编译器在解决重载方面遇到了更多困难。

这里是来源的link