IEnumerableがなぜ .リストへ () リストを返す IListの代わりに ? 質問する

IEnumerableがなぜ .リストへ () リストを返す IListの代わりに ? 質問する

拡張メソッドToList()は を返しますList<TSource>。同じパターンに従って、ToDictionary()を返しますDictionary<TKey, TSource>

IList<TSource>これらのメソッドが戻り値をそれぞれおよびとして入力しないのはなぜか、不思議です。は戻り値を実際の実装ではなくインターフェースとして入力するIDictionary<TKey, TSource>ため、これはさらに奇妙に思えます。ToLookup<TSource, TKey>

これらの拡張メソッドのソースを見ると、ドットピークまたは他のデコンパイラーでは、次の実装が表示されます (ToList()短いため示します)。

public static List<TSource> ToList<TSource>(this IEnumerable<TSource> source) { 
   if (source == null) throw Error.ArgumentNull("source");
   return new List<TSource>(source); 
}

では、なぜこのメソッドは戻り値をインターフェイス自体ではなく、インターフェイスの特定の実装として型指定するのでしょうか? 唯一の変更点は戻り値の型です。

これら 2 つのケースを除いて、拡張機能の署名は非常に一貫しているため、興味がありますIEnumerable<>。私はいつも、少し奇妙だと思っていました。

さらに、事態をさらに混乱させるのは、ドキュメントToLookup()状態:

指定されたキー セレクター関数に従って、IEnumerable から Lookup を作成します。

ただし、戻り値の型は ですILookup<TKey, TElement>

エデュリンク、Jon Skeet は戻り値の型がList<T>ではなく であると述べていますIList<T>が、それ以上の話題には触れていません。
広範囲に検索しても答えが得られなかったので、ここで質問します。

戻り値をインターフェースとして型付けしないのは、設計上の決定によるものでしょうか、それとも単なる偶然でしょうか?

ベストアンサー1

を返すと、の一部ではないList<T>のメソッドを簡単に使用できるという利点があります。ではできても ではできないことが数多くあります。List<T>IList<T>List<T>IList<T>

対照的に、には ( ) を持たないLookup<TKey, TElement>メソッドが 1 つだけあり、おそらくそのメソッドは結局使用されないでしょう。ILookup<TKey, TElement>ApplyResultSelector

おすすめ記事