このなぜHashSetは<T>ですか.IsReadOnly明示的ですか?
var h = new HashSet<int>();
var r = h.IsReadOnly;
はコンパイルされません。私はしなければならない
var r = ((ICollection<int>)h).IsReadOnly;
なぜIsReadOnlyが正常に実装されなかったのですか? (私はどのようにを求めていないんだけど、なぜ)
このなぜHashSetは<T>ですか.IsReadOnly明示的ですか?
var h = new HashSet<int>();
var r = h.IsReadOnly;
はコンパイルされません。私はしなければならない
var r = ((ICollection<int>)h).IsReadOnly;
なぜIsReadOnlyが正常に実装されなかったのですか? (私はどのようにを求めていないんだけど、なぜ)
私は推測しているそのHashSetのは、ICollectionを実装しながら、IsReadOnlyのはHashSetのは意味がありません、ので。実際、それを反映すると、プロパティは常にfalseを返します。これを実装すると、パブリックインターフェイスからこのメソッドが明示的に隠されます。
もう1つの理由は、ICollectionインターフェイスが、クラスの主な使用に必要であるためではなく、付随的な理由(xamlシリアル化をサポートするなど)のために実装できるためです。したがって、明示的にそれを実装することで、クラスのインタフェースからクラッタを取り除くことができます。
は、基本的には、明示的なインターフェイスの実装(:MSDNソース):に訴えるなぜ二つの理由があります
HashSet<T>
についてはハッシュセットは読み取り専用されることはありませんし、IsReadOnly
は、このように常にfalse
を返しますよう、後者の場合は、適用されます。
ああ、そうですね。 HashSetは、私が推測するのと同じ理由でIsReadOnlyを隠すので、それを使用しようとするとコンパイルエラーが発生します。 –
ところで、xamlのシリアル化にICollectionを実装する必要はありません。コレクションはIDictionaryまたはIListを実装する必要があります。これは、偶発的な理由でインタフェースを実装する必要がある場合の例です。 – Will