2009-04-13 7 views
12

このなぜHashSetは<T>ですか.IsReadOnly明示的ですか?

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

はコンパイルされません。私はしなければならない

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

なぜIsReadOnlyが正常に実装されなかったのですか? (私はどのようにを求めていないんだけど、なぜ

答えて

16

私は推測しているそのHashSetのは、ICollectionを実装しながら、IsReadOnlyのはHashSetのは意味がありません、ので。実際、それを反映すると、プロパティは常にfalseを返します。これを実装すると、パブリックインターフェイスからこのメソッドが明示的に隠されます。

もう1つの理由は、ICollectionインターフェイスが、クラスの主な使用に必要であるためではなく、付随的な理由(xamlシリアル化をサポートするなど)のために実装できるためです。したがって、明示的にそれを実装することで、クラスのインタフェースからクラッタを取り除くことができます。

+0

ああ、そうですね。 HashSetは、私が推測するのと同じ理由でIsReadOnlyを隠すので、それを使用しようとするとコンパイルエラーが発生します。 –

+0

ところで、xamlのシリアル化にICollectionを実装する必要はありません。コレクションはIDictionaryまたはIListを実装する必要があります。これは、偶発的な理由でインタフェースを実装する必要がある場合の例です。 – Will

5

は、基本的には、明示的なインターフェイスの実装(:MSDNソース):に訴えるなぜ二つの理由があります

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

ハッシュセットは読み取り専用されることはありませんし、IsReadOnlyは、このように常にfalseを返しますよう、後者の場合は、適用されます。

関連する問題