Причина, по которой вы получаете это, заключается в том, что возвращаемый тип не принимается (достаточно) во внимание при определении кандидатов на перегрузку в C# 7.2 или старше. Таким образом, список потенциальных кандидатов не содержит только 1 метод, и компилятор останавливается из-за ошибки неоднозначности.
Это было улучшено в C# 7.3 :
- Для преобразования группы методов методы-кандидаты, тип возвращаемого значения которых не совпадает с типом возвращаемого значения делегата, удаляются из набора.
Это также объясняет, почему ваша лямбда работает, это не является преобразованием группы методов, другая часть компилятора срабатывает и, по-видимому, способна определить правильную перегрузку.
И действительно, если я скомпилирую ваш код с C# 7.0, 7.1 или 7.2, я get:
[CS0121] Вызов неоднозначен для следующих методов или свойств: 'Task.Run (Fun c)' и 'Task.Run (Веселье c ) '
... но если я изменю его на 7.3, он компилируется и использует перегрузку Func<int>
.