質問

これ

var h = new HashSet<int>();
var r = h.IsReadOnly;

コンパイルされません。私がしなければなりません

var r = ((ICollection<int>)h).IsReadOnly;

なぜ IsReadOnly が正常に実装されなかったのでしょうか?

(尋ねているわけではありません どうやって, 、 しかし なぜ)

役に立ちましたか?

解決

これは、HashSet が ICollection を実装している一方で、IsReadOnly は HashSet にとって意味を持たないためだと推測しています。実際、これを反映すると、プロパティは常に false を返します。これを実装すると、このメソッドがパブリック インターフェイスから明示的に非表示になります。

もう 1 つの理由は、ICollection インターフェイスがクラスの主な使用に必要であるという理由ではなく、偶発的な理由 (xaml シリアル化をサポートするためなど) で実装される可能性があるためです。したがって、これを明示的に実装すると、クラスのインターフェイスが乱雑になるのを防ぐことができます。

他のヒント

明示的なインターフェイス実装に頼る理由は基本的に 2 つあります (出典: MSDN):

  1. 同じ署名を含むメンバーを持つ複数のインターフェースを実装し、これらのメンバーに異なる動作をさせたいとします。
  2. インターフェイス メンバーはクラスにとって特に重要ではありませんが、インターフェイスによってオブジェクトを参照するために必要です。

のために HashSet<T>, 、ハッシュ セットは決して読み取り専用ではないため、後者のケースが当てはまります。 IsReadOnly したがって常に戻ってきます false.

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