Почему этот вызов метода неоднозначен? - PullRequest
6 голосов
/ 09 июля 2019

Почему первый вызов Foo ниже компилируется, а второй вызывает неоднозначную ошибку компиляции вызова?

(используя c # 7.2)

    private static void AmbiguousAsyncOverload() {
      Foo(() => Bar());  // This is OK
      //Foo(Bar);        // Error, ambiguous overload
    }

    private static void Foo(Func<int> func) {
      func();
    }

    private static void Foo(Func<string> func) {
      func();
    }

    private static int Bar() {
      return 4;
    }

Если я удаляю первую (Func<int>) реализацию Foo и, следовательно, возможность двусмысленности, то компилятор (правильно) сообщает, что Bar не имеет правильной сигнатуры для передачи в Foo, что означает, что у него достаточно информации, чтобы устранить неоднозначность.

Я бы понял, если бы компилятор не смотрел возвращаемые значения при разрешении перегрузки, и поэтому оба вызова завершились неудачно, но мой вопрос заключается в том, почему один вызов компилируется нормально, а другой - нет.

1 Ответ

6 голосов
/ 09 июля 2019

Это была проблема для всех версий C # вплоть до исправления в v7.3. Типы возврата не были приняты во внимание при разрешении перегрузки. Из заметок о выпуске (или языкового предложения ) для C # 7.3:

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