7

ReadOnlyCollection<T>ICollection<T>AddやRemoveなどのメソッドを持つインターフェースを実現。属性を使用して Intellisense からメソッドを非表示にする方法は知っていますが、これらのメソッドを使用しようとすると実際にコンパイル エラーが発生する可能性はありますか?

(ちなみに、ROC で Add と Remove を呼び出すのは意味がないことはわかっています。これは、正しいデータ構造を使用することではなく、継承されたメンバーのコンパイル エラーを引き起こすことに関する問題です)。

4

2 に答える 2

17

これらは、次のように明示的なインターフェイスの実装で実装されます。

void ICollection<T>.Add(T item) {
    throw NotSupportedException();
}

メソッドは引き続き呼び出し可能ですが、オブジェクトをICollection<T>. 例えば:

ReadOnlyCollection<int> roc = new ReadOnlyCollection<int>(new[] { 1, 2, 3 });
// Invalid
// roc.Add(10);

ICollection<int> collection = roc;
collection.Add(10); // Valid at compile time, but will throw an exception
于 2010-11-08T07:56:44.167 に答える
2

実際、ICollection<T>インターフェイスからこれらのメソッドを明示的に実装することにより、それらを直接呼び出すことはできません。オブジェクト (インスタンス) を明示的
にキャストする必要があります。その後、Add メソッドを呼び出すことができます。(したがって、実行時例外は発生しますが、コンパイラは文句を言いません)。ReadOnlyCollectionICollection<T>

于 2010-11-08T08:01:31.910 に答える