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

不编译。我要做

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

为什么IsReadOnly没有正常实现?

(我不是问 如何, , 但 为什么)

有帮助吗?

解决方案

我猜它,因为当HashSet的实现ICollection的,IsReadOnly有HashSet的没有意义。事实上,如果你反映它的属性始终返回false。明确地实现它隐藏了公共接口这种方法。

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

其他提示

基本上有两个原因导致您求助于显式接口实现(来源: 微软软件定义网络):

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top