HashSet<T>.IsReadOnly が明示的であるのはなぜですか?
-
09-09-2019 - |
質問
これ
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):
- 同じ署名を含むメンバーを持つ複数のインターフェースを実装し、これらのメンバーに異なる動作をさせたいとします。
- インターフェイス メンバーはクラスにとって特に重要ではありませんが、インターフェイスによってオブジェクトを参照するために必要です。
のために HashSet<T>
, 、ハッシュ セットは決して読み取り専用ではないため、後者のケースが当てはまります。 IsReadOnly
したがって常に戻ってきます false
.
所属していません StackOverflow