Почему это преобразование группы методов неоднозначно в C # 7.2 и ниже? - PullRequest
0 голосов
/ 20 ноября 2018

Учитывая следующий класс:

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 и приведения к анонимному делегату.

Edit: похоже, что это не влияет на C # 7.3, но влияет на версии 7.2 и ниже.На версии до добавления локальных методов можно повлиять, сделав статическими GetInteger и GetDouble.

1 Ответ

0 голосов
/ 20 ноября 2018

Что нового в C # 7.3

В существующие функции были внесены следующие улучшения:

  • Вы можете протестировать == и! = С типами кортежей.
  • Вы можете использовать переменные выражения в большем количестве мест.
  • Вы можете прикрепить атрибуты к базовому полю автоматически реализуемых свойств.
  • Улучшено разрешение метода, когда аргументы отличаются в.
  • Разрешение перегрузки теперь имеет меньше неоднозначных случаев.

Последнее исправление было для этой проблемы.До этого у компилятора было больше проблем с разрешением перегрузок.

Вот ссылка на источник.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...