为什么HashSet <T> .IsReadOnly显式?

rip*_*234 12 c# interface hashset explicit-interface icollection

这个

var h = new HashSet<int>();
var r = h.IsReadOnly;
Run Code Online (Sandbox Code Playgroud)

不编译.我要做

var r = ((ICollection<int>)h).IsReadOnly;
Run Code Online (Sandbox Code Playgroud)

为什么IsReadOnly没有正常实施?

(我不是问怎么样,但为什么)

小智 17

我猜它是因为,当HashSet实现ICollection时,IsReadOnly对HashSet没有意义.实际上,如果您反映它,该属性始终返回false.明确地实现它会从公共接口隐藏此方法.

另一个原因是因为ICollection接口可能由于偶然原因(例如,支持xaml序列化)而实现,而不是因为它对于类的主要用途是必要的.因此,明确地实现它可以将杂乱的东西排除在类的接口之外.


Tor*_*kår 5

您使用显式接口实现(源:MSDN)基本上有两个原因:

  1. 您使用包含相同签名的成员实现多个接口,并且您希望这些成员的行为不同.
  2. 接口成员对类不是特别感兴趣,但是为了通过接口引用对象是必需的.

因为HashSet<T>后一种情况适用,因为哈希集永远不会是只读的,IsReadOnly因此总会返回false.