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、ジェネリック パラメータが入力位置にのみある場合 ( の述語など) では、メソッド グループの変換は正常に機能します。ただし、ジェネリック パラメーターが戻り値の型 (SelectまたはOrderByプロジェクションなど) である場合、コンパイラは適切なデリゲート変換を推論しません。

于 2008-11-06T19:02:48.137 に答える
8

ReturnNumberはメソッドではありません。代わりに、名前を持つすべてのメソッドを含むメソッド グループを表しますReturnNumberが、アリティと型のシグネチャが異なる可能性があります。そのメソッド グループのどのメソッドが実際に非常に一般的で常に機能するかを判断するには、いくつかの技術的な問題があります。明らかに、コンパイラーはほとんどの場合、それを理解することができましたが、半分の時間しか機能しないアルゴリズムをコンパイラーに入れることは悪い考えであるという決定が下されました。

ただし、次のように動作します。

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