5

我今天在 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;
4

2 回答 2

8

这也可能与在 Method Groups 上不起作用的“返回类型推断”有关

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

于 2008-11-06T19:02:48.137 回答
8

ReturnNumber不是方法 - 相反,它表示一个方法组,其中包含具有名称但可能具有不同的arity-and-type签名的所有方法。ReturnNumber以非常通用且每次都有效的方式确定您真正想要的方法组中的哪种方法存在一些技术问题。显然,编译器在某些时候甚至大部分时间都可以计算出来,但是决定将一种算法放入编译器中,它只能在一半时间内工作,这是一个坏主意。

但是,以下工作:

someCollection.OrderBy(new Func<SomeClass, int>(ReturnNumber))
于 2008-11-06T19:08:50.653 回答