9

にない方法が1つあります:Lookup<,>ILookup<,>

public IEnumerable<TResult> ApplyResultSelector<TResult>(
    Func<TKey, IEnumerable<TElement>, TResult> resultSelector);

のインスタンスを常に返すように見えるにもかかわらず、の戻り型がEnumerable.ToLookup<>()宣言されているのはなぜですか?代わりに戻り型がであると宣言された場合、上記のメソッドはキャストなしで使用できます。ILookup<,>Lookup<,>Lookup<,>

4

1 に答える 1

16

パブリックAPIを設計するためのベストプラクティスでは、必要に応じて別の具象クラスを返すことができるため、具象クラスを返すよりもインターフェースを返す方がよいとされています。APIのコンシューマーは、返されたインスタンスが特定のタイプであることに依存することは想定されていません。

ご指摘のとおり、インターフェイスではなく具象型ToListを返します。ToDictionaryおそらくこれの理由は、必要に応じて変更できるコピーを返すことを目的としていToListたためです。およびインターフェースは、それらが編集可能であることを保証しないため(これはおそらく悪い考えでした)、設計者は具象型を返すことにしました。ToDictionaryIListIDictionary

架空のToIList()方法を想像してみてください。配列で呼び出された場合、配列はを実装するため、配列のコピーを返すように実装できますIList<T>Add()次に、呼び出しがスローされることに驚かれるかもしれません。

一方、ILookupは読み取り専用インターフェースであるため、上記は適用されません。したがって、のようにベストプラクティスに従わない理由はありませんToList

于 2010-10-03T15:53:59.973 に答える