Почему эту именованную функцию нельзя передавать как аргумент Func <> в C #? - PullRequest
2 голосов
/ 22 июля 2010

У меня проблемы с пониманием правил прохождения делегатов в 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, хотя нигде в коде нет ссылок на них Откуда это пришло? Разве ссылка на функцию не может быть неявно приведена к делегату с такой же подписью?

1 Ответ

3 голосов
...