Почему это преобразование группы методов неоднозначно в C# 7.2 и ниже?
Учитывая следующий класс:
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 ответ
Решение
Что нового в C# 7.3
Следующие улучшения были внесены в существующие функции:
- Вы можете проверить == и!= С типами кортежей.
- Вы можете использовать переменные выражения в большем количестве мест.
- Вы можете прикрепить атрибуты к основному полю автоматически реализуемых свойств.
- Разрешение метода, когда аргументы отличаются в, было улучшено.
- Разрешение перегрузки теперь имеет меньше неоднозначных случаев.
Последнее исправление было для этой проблемы. До этого у компилятора было больше проблем с разрешением перегрузок.
Вот ссылка на источник.