У меня проблемы с пониманием правил прохождения делегатов в C # 3.0. Последний .Max()
дает ошибку компиляции, как показано ниже, но я не могу понять, в чем заключается существенная разница между этим случаем и любым другим.
int NamedIdentity(int val) { return val; }
Func<int, int> Identity = x => x;
void Main() {
var range = Enumerable.Range(1, 10);
range.Max();
range.Max(x => x);
range.Max(Identity);
range.Max((Func<int, int>) NamedIdentity);
range.Max(new Func<int, int>(NamedIdentity));
// this line gives compile error
range.Max(NamedIdentity);
/* The call is ambiguous between the following methods or properties:
* 'System.Linq.Enumerable.Max<int>(System.Collections.Generic.IEnumerable<int>, System.Func<int,decimal>)' and
* 'System.Linq.Enumerable.Max<int>(System.Collections.Generic.IEnumerable<int>, System.Func<int,decimal?>)'
*/
}
Почему это не компилируется? Насколько я понимаю, NamedIdentity
объявлен как Func<int, int>
, поэтому его не нужно кастовать, хотя, очевидно, я ошибаюсь. Одна подсказка в том, что ошибка компиляции говорит о Decimal
s, хотя нигде в коде нет ссылок на них Откуда это пришло? Разве ссылка на функцию не может быть неявно приведена к делегату с такой же подписью?