12

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

不编译。我要做

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

为什么 IsReadOnly 没有正常实施?

(我不是问如何,而是为什么

4

2 回答 2

17

我猜是因为,虽然 HashSet 实现了 ICollection,但 IsReadOnly 对 HashSet 没有任何意义。事实上,如果你反映它,该属性总是返回false。显式实现它会在公共接口中隐藏此方法。

另一个原因是,ICollection 接口的实现可能是由于偶然的原因(例如,为了支持 xaml 序列化),而不是因为它对于类的主要使用是必需的。因此,显式地实现它可以避免类接口的混乱。

于 2009-04-13T10:17:53.337 回答
5

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

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

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

于 2009-04-13T10:38:10.087 回答