Из двух методов 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() { }
}
Вопрос: это по спецификации так должно быть или недоработка в компиляторах? Спецификацию попробовал почитать, но не осилил.