1

可能重复:
当 IsReadOnly 是接口成员时,List<T> 如何使 IsReadOnly 成为私有?

好吧,这让我发疯了。List<T>实现IList<T>。然而,

IList<int> list = new List<int>();
bool b = list.IsReadOnly;
bool c = ((List<int>)list).IsReadOnly;    // Error

错误是:

“System.Collections.Generic.List”不包含“IsReadOnly”的定义,并且找不到接受“System.Collections.Generic.List”类型的第一个参数的扩展方法“IsReadOnly”(您是否缺少 using 指令还是汇编参考?)

怎么会这样?这不违反我们告诉所有人的关于不隐藏成员的规则吗?这里的实现细节是什么?

4

4 回答 4

5

因为实现是通过显式接口实现的。

意味着它被定义为

bool IList<T>.IsReadOnly { get; set; //etc }

http://msdn.microsoft.com/en-us/library/aa288461(VS.71).aspx

这就是为什么它不在列表之外的原因。

于 2011-09-23T04:51:28.413 回答
1

List<T>显式实现IList<T>,因此您必须先将对象强制转换为接口,然后才能访问IsReadOnly. 来自 MSDN:

实现接口的类可以显式地实现该接口的成员。显式实现成员时,不能通过类实例访问,只能通过接口的实例访问

于 2011-09-23T04:53:15.623 回答
0

如果您查看 List 类,您会看到:

 bool IList.IsReadOnly { [TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
        get; }

真正相关的是 IsReadOnly 是使用显式实现声明的,这意味着只有将对象声明为 IList 时才能看到该属性。

于 2011-09-23T04:52:02.720 回答
0

显式接口实现,例如:

bool IList<T>.IsReadOnly { get; }
于 2011-09-23T04:52:57.980 回答