"The call is ambiguous..."
От: alexzzzz  
Дата: 10.08.17 11:03
Оценка:
Из двух методов Outer компилятор (и Mono и Розлин) не может выбрать подходящий. Считает, что подходят оба, хотя реально подходит только один.

public class Foo
{
    public Foo ()
    {
        Outer(Inner); // CS0121: The call is ambiguous between the following methods or properties: 'Foo.Outer(Action)' and 'Foo.Outer(Func<int>)'
    }

    void Inner () {  }
    
    void Outer(Action inner) { }
    void Outer(Func<int> inner) { }
}

public class Foo
{
    public Foo()
    {
        Outer(Inner); // такая же ошибка
    }

    int Inner(int i) => throw new NotImplementedException();

    void Outer(Func<int, bool> inner) { }
    void Outer(Func<int, int> inner) { }
}

Я так понимаю, компилятор не различает типы параметров-делегатов по типу их возвращаемого значения.

Но если делегат не параметр, а локальная переменная, то начинает различать и не путается:
public class Foo
{
    public Foo()
    {
        Action a = Inner; // ок
        Func<int> b = Inner; // void Foo.Inner() has wrong return type
    }

    void Inner() { }
}


Вопрос: это по спецификации так должно быть или недоработка в компиляторах? Спецификацию попробовал почитать, но не осилил.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.