eNumerable.tolookup <>()は、lookup <、>ではなくilookup <、>を返すのですか?
-
27-09-2019 - |
質問
がある 1 メソッドイン Lookup<,>
それはありません ILookup<,>
:
public IEnumerable<TResult> ApplyResultSelector<TResult>(
Func<TKey, IEnumerable<TElement>, TResult> resultSelector);
なぜ戻りタイプのものなのか Enumerable.ToLookup<>()
あると宣言されています ILookup<,>
それは常にのインスタンスを返しているように見えるという事実にもかかわらず Lookup<,>
?代わりに返品タイプが宣言された場合 Lookup<,>
, 、上記の方法は、キャストなしで使用できます。
解決
パブリックAPIを設計するためのベストプラクティスは、インターフェイスを返すことは、具体的なクラスを返すよりも優れたアイデアであることを決定します。 APIの消費者は、特定のタイプの返されたインスタンスに依存することは想定されていません。
あなたが指摘するように、 ToList
と ToDictionary
インターフェイスではなくコンクリートタイプを返します。おそらくこの理由はそれです ToList
と ToDictionary
あなたができるコピーを返すことを意図していました 変更 あなたがしたいべきです。以来 IList
と IDictionary
インターフェイスは、それらが編集可能であることを保証するものではありません(これはおそらく悪い考えだった)、デザイナーはコンクリートタイプを返すことにしました。
仮説を想像してください ToIList()
方法。配列で呼び出された場合、配列が実装されているため、配列のコピーを返すように実装できます IList<T>
. 。その後、あなたはその呼び出しを見つけて驚くかもしれません Add()
スロー。
一方で、 ILookup
読み取り専用のインターフェイスなので、上記は適用されません。したがって、理由はありません いいえ あるように、ベストプラクティスに従うために ToList
.