为什么HashSet <t> .IsReadOnly显式?</t>

时间:2009-04-13 09:59:31

标签: c# interface hashset icollection explicit-interface

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

无法编译。我必须做

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

为什么IsReadOnly没有正常实施?

(我不是要求如何,而是为什么

2 个答案:

答案 0 :(得分:17)

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

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

答案 1 :(得分:5)

基本上有两个理由可以使用显式接口实现(来源:MSDN):

  1. 您使用包含相同签名的成员实现多个接口,并且您希望这些成员的行为方式不同。
  2. 接口成员对类不是特别感兴趣,但是为了通过接口引用对象是必需的。
  3. 对于HashSet<T>,后一种情况适用,因为哈希集永远不会是只读的,因此IsReadOnly将始终返回false