C#3.0 Func/OrderBy类型推断

Pro*_*ool 5 c# lambda type-inference

我今天和OrderBy碰到了奇怪的情况:

Func<SomeClass, int> orderByNumber = 
  currentClass => 
   currentClass.SomeNumber;
Run Code Online (Sandbox Code Playgroud)

然后:

someCollection.OrderBy(orderByNumber);
Run Code Online (Sandbox Code Playgroud)

这很好,但我打算创建一个方法,因为它可能在除orderBy之外的其他地方可用.

private int ReturnNumber(SomeClass currentClass)
{
  return currentClass.SomeNumber;
}
Run Code Online (Sandbox Code Playgroud)

现在,当我尝试将其插入OrderBy时:

someCollection.OrderBy(ReturnNumber);
Run Code Online (Sandbox Code Playgroud)

如果我使用Func,它无法推断它的类型.在我看来它们应该是相同的,因为方法本身就像Func一样是"强类型"的.

旁注:我意识到我可以这样做:

Func<SomeClass, int> orderByNumber = ReturnNumber;
Run Code Online (Sandbox Code Playgroud)

Jac*_*ter 8

这也可能与"返回类型推断"无关,而不适用于方法组.

本质上,在Where通用参数仅在输入位置的情况下(如谓词),方法组转换工作正常.但是在泛型参数是返回类型(如Select或者OrderBy投影)的情况下,编译器不会推断出适当的委托转换.


yfe*_*lum 8

ReturnNumber不是一个方法-相反,它表示包含一个方法组所有的名称的方法ReturnNumber,但是具有可能不同的元数和式签名.有一些技术问题可以通过非常通用和每次工作的方式确定您实际想要的方法组中的哪种方法.显然,编译器可以在某些时候,甚至是大多数时候都能找到它,但是决定将算法放入编译器只能工作一半的时间是一个坏主意.

但是,以下工作:

someCollection.OrderBy(new Func<SomeClass, int>(ReturnNumber))
Run Code Online (Sandbox Code Playgroud)