我今天和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;
答案 0 :(得分:8)
这也可能与"return-type type inference" not working on Method Groups有关。
基本上,在通用参数仅在输入位置的情况下(如Where
的谓词),方法组转换工作正常。但是在泛型参数是返回类型(如Select
或OrderBy
投影)的情况下,编译器不会推断出适当的委托转换。
答案 1 :(得分:8)
ReturnNumber
不是方法 - 相反,它代表一个方法组,其中包含名为ReturnNumber
的所有方法,但可能具有不同的arity - 和 - 类型签名。有一些技术问题可以通过非常通用和每次工作的方式确定您实际想要的方法组中的哪种方法。显然,编译器可以在某些时候,甚至大部分时间都能找到它,但是决定将算法放入编译器只能工作一半的时间是一个坏主意。
以下作品:
someCollection.OrderBy(new Func<SomeClass, int>(ReturnNumber))