Почему первый вызов 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
, что означает, что у него достаточно информации, чтобы устранить неоднозначность.
Я бы понял, если бы компилятор не смотрел возвращаемые значения при разрешении перегрузки, и поэтому оба вызова завершились неудачно, но мой вопрос заключается в том, почему один вызов компилируется нормально, а другой - нет.