Столь странная ситуация, с которой я столкнулся сегодня с 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;





Это также может быть связано с "вывод типа возвращаемого типа" не работает с группами методов.
По сути, в случаях (таких как предикат Where), когда общие параметры находятся только в позициях ввода, преобразование группы методов работает нормально. Но в случаях, когда универсальный параметр является возвращаемым типом (например, проекции Select или OrderBy), компилятор не сделает вывод о соответствующем преобразовании делегата.
ReturnNumber - это метод нет, вместо этого он представляет группу методов, содержащую методы все с именем ReturnNumber, но с потенциально разными сигнатурами арности и типа. Есть некоторые технические проблемы, связанные с определением того, какой метод из этой группы методов вам действительно нужен, в очень общем и постоянно работающем виде. Очевидно, компилятор мог понимал это в некоторых случаях, даже в большинстве случаев, но было принято решение, что включение в компилятор алгоритма, который работал бы только половину времени, было плохой идеей.
Однако работает следующее:
someCollection.OrderBy(new Func<SomeClass, int>(ReturnNumber))
Группа методов - это то, о чем я не думал. Хотел бы я отметить два ответа.