eNumerable.tolookup <>()は、lookup <、>ではなくilookup <、>を返すのですか?

StackOverflow https://stackoverflow.com/questions/3850469

  •  27-09-2019
  •  | 
  •  

質問

がある 1 メソッドイン Lookup<,> それはありません ILookup<,>:

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

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

役に立ちましたか?

解決

パブリックAPIを設計するためのベストプラクティスは、インターフェイスを返すことは、具体的なクラスを返すよりも優れたアイデアであることを決定します。 APIの消費者は、特定のタイプの返されたインスタンスに依存することは想定されていません。

あなたが指摘するように、 ToListToDictionary インターフェイスではなくコンクリートタイプを返します。おそらくこの理由はそれです ToListToDictionary あなたができるコピーを返すことを意図していました 変更 あなたがしたいべきです。以来 IListIDictionary インターフェイスは、それらが編集可能であることを保証するものではありません(これはおそらく悪い考えだった)、デザイナーはコンクリートタイプを返すことにしました。

仮説を想像してください ToIList() 方法。配列で呼び出された場合、配列が実装されているため、配列のコピーを返すように実装できます IList<T>. 。その後、あなたはその呼び出しを見つけて驚くかもしれません Add() スロー。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top