提供以下课程:
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设置为静态,可以影响添加本地方法之前的版本。
答案 0 :(得分:5)
C#7.3的新功能
对现有功能进行了以下增强:
- 您可以使用元组类型测试==和!=。
- 您可以在更多位置使用表达式变量。
- 您可以将属性附加到自动实现属性的后备字段。
- 改进了当参数不同时的方法分辨率。
- 重载解决方案现在具有更少的歧义情况。
最后一个解决方法是针对此问题。在此之前,编译器在解决重载方面遇到了更多困难。
这里是来源的link。