C # 3.0 Вывод типа Func / OrderBy - PullRequest
5 голосов
/ 06 ноября 2008

Странная ситуация, с которой я столкнулся сегодня с OrderBy:

Func<SomeClass, int> orderByNumber = 
  currentClass => 
   currentClass.SomeNumber;

Тогда:

someCollection.OrderBy(orderByNumber);

Это нормально, но вместо этого я собирался создать метод, потому что он мог бы использоваться где-то еще, кроме orderBy.

private int ReturnNumber(SomeClass currentClass)
{
  return currentClass.SomeNumber;
}

Теперь, когда я пытаюсь подключить это к OrderBy:

someCollection.OrderBy(ReturnNumber);

Он не может вывести тип, как если бы я использовал Func. Мне кажется, что они должны быть одинаковыми, поскольку сам метод "строго типизирован", как Func.

Примечание: я понимаю, что могу сделать это:

Func<SomeClass, int> orderByNumber = ReturnNumber;

Ответы [ 2 ]

8 голосов
/ 06 ноября 2008

ReturnNumber - это , а не метод - вместо этого он представляет группу методов, содержащую все методы с именем ReturnNumber, но с потенциально разными сигнатурами типа и типа. Существуют некоторые технические проблемы с определением того, какой метод в этой группе методов вам действительно нужен, очень общим и работающим каждый раз способом. Очевидно, что компилятор мог бы вычислять это время от времени, даже большую часть времени, но было принято решение, что внедрение алгоритма в компилятор, который будет работать только половину времени, было плохой идеей.

Однако работает следующее:

someCollection.OrderBy(new Func<SomeClass, int>(ReturnNumber))
8 голосов
/ 06 ноября 2008

Это также может быть связано с «выводом типа возвращаемого типа», не работающим в группах методов .

По существу, в случаях (например, предикат Where), где общие параметры находятся только во входных позициях, преобразование группы методов работает нормально. Но в тех случаях, когда универсальный параметр является типом возврата (например, проекции Select или OrderBy), компилятор не будет выводить соответствующее преобразование делегата.

...