1. ホーム
  2. c#

[解決済み] なぜ配列はIListを実装しているのか?

2022-04-27 03:05:40

質問

の定義を参照してください。 システム.配列 クラス

public abstract class Array : IList, ...

理論的には、私はこの部分を書いて幸せになることができるはずです。

int[] list = new int[] {};
IList iList = (IList)list;

また、iListから任意のメソッドを呼び出せるようにする必要があります。

 ilist.Add(1); //exception here

私の疑問は、なぜ例外が発生するのかということではなく なぜArrayはIListを実装しているのか ?

解決方法は?

配列はインデックスによる高速アクセスが可能であるため IList / IList<T> は、これをサポートする唯一のコレクション・インターフェースです。ですから、おそらくあなたの本当の疑問は、「なぜインデクサを持つ定数コレクションのためのインタフェースがないのですか?

コレクションには、読み取り専用のインターフェースもありません。そして私は、インデクサ付きの定型サイズインターフェース以上に、それらを見逃しているのです。

コレクションの機能に応じて、さらにいくつかの(一般的な)コレクション・インターフェイスがあるべきだと思っています。そして、その名前も異なるものであるべきです。 List インデックスを持つものに対して、本当に愚かなことだと思います。

  • 単なる列挙 IEnumerable<T>
  • 読み取り専用でインデクサなし(.Count、.Contains、...)。
  • サイズ変更可能だがインデクサがない、つまり(Add, Remove,...) のようなセット 現在のところ ICollection<T>
  • インデクサによる読み取り専用(indexer, indexof,...)
  • インデクサでサイズ一定(セッター付きインデクサ)
  • インデクサによる可変サイズ(Insert、...)現在 IList<T>

現在のコレクション・インターフェースは、デザインが悪いと思うんです。しかし、どのメソッドが有効かを示すプロパティを持っているので(これはこれらのメソッドの契約の一部です)、置換の原則を破るものではありません。