Компилятор пытается вывести общие типы параметров для Bar
, но сделать это он должен знать все типы аргументов. Аргумент, который у вас есть (Test.MyComplex
), фактически является группой методов, а не делегатом, поэтому компилятор также должен вставлять преобразование в совместимый тип делегата. Однако это невозможно, поскольку он не знает, какие типы делегатов использовать, поскольку вывод типа в методе, который должен быть совместим, еще не завершен. Там проблема с курицей и яйцом, и компилятор отказывается сказать, что вызов неоднозначен. Эрик Липперт указывает на комментарии к очень похожим question, что в простых случаях, подобных этому, он может быть разработан, но за счет усложнения правил разрешения перегрузки.
К сожалению, вы должны сделать что-то, что дает компилятору больше информации:
foo.Bar<string, string>(Test.MyComplex);
или
Action<string, string> action = Test.MyComplex;
foo.Bar(action);
возможный дубликат [Почему не C# Тип делать вывод из этого, казалось бы, простой, очевидный случай ] (http://stackoverflow.com/questions/6229131/why-cant-c-sharp-infer-type-from-this-seemingly-simple-obvious-case) –