拡張メソッドToList()
はを返しますList<TSource>
。同じパターンに従って、をToDictionary()
返しますDictionary<TKey, TSource>
。
IList<TSource>
これらのメソッドが戻り値をそれぞれおよびとして入力しない理由に興味がありIDictionary<TKey, TSource>
ます。ToLookup<TSource, TKey>
実際の実装ではなくインターフェイスとして戻り値を入力するため、これはさらに奇妙に思えます。
dotPeekまたは他の逆コンパイラーを使用してこれらの拡張メソッドのソースを見ると、次の実装がわかります(ToList()
短いため表示されています)。
public static List<TSource> ToList<TSource>(this IEnumerable<TSource> source) {
if (source == null) throw Error.ArgumentNull("source");
return new List<TSource>(source);
}
では、なぜこのメソッドは、インターフェイス自体ではなく、インターフェイスの特定の実装として戻り値を入力するのでしょうか。唯一の変更はリターンタイプです。
IEnumerable<>
これらの2つの場合を除いて、拡張機能の署名は非常に一貫しているので、私は興味があります。いつもちょっと変だと思っていました。
さらに、物事をさらに混乱させるために、州のドキュメントは次のとおりです。ToLookup()
指定されたキーセレクター関数に従って、IEnumerableからルックアップを作成します。
ただし、戻りタイプはILookup<TKey, TElement>
です。
Edulinqで、Jon Skeetは、リターンタイプがList<T>
の代わりであると述べていますが、それIList<T>
以上主題に触れていません。
広範囲にわたる検索では答えが得られなかったので、ここで私はあなたに尋ねます:
戻り値をインターフェイスとして入力しないことの背後にある設計上の決定はありますか、それとも単なる偶然ですか?