可能重复:
How does List<T> make IsReadOnly private when IsReadOnly is an interface member?
好的,这让我疯了。 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'的定义,并且没有扩展方法'IsReadOnly'接受类型为'System.Collections.Generic.List'的第一个参数'(你丢失了吗?) using指令或程序集引用?)
这怎么可能?这是否违反了我们告诉所有人的规则,关于不隐藏会员?这里的实施细节是什么?
答案 0 :(得分:5)
因为实现是通过显式接口实现的。
意思是它被定义为
bool IList<T>.IsReadOnly { get; set; //etc }
http://msdn.microsoft.com/en-us/library/aa288461(VS.71).aspx
这就是为什么它不在List之外。
答案 1 :(得分:1)
List<T>
显式实现IList<T>
,因此您必须先将对象强制转换为接口,然后才能访问IsReadOnly
。来自MSDN:
实现接口的类可以显式实现成员 那个界面。当成员明确实现时,它不能 可以通过类实例访问,但只能通过实例访问 界面
答案 2 :(得分:0)
如果查看List类,您会看到:
bool IList.IsReadOnly { [TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
get; }
所有真正相关的是IsReadOnly是使用显式实现声明的,这意味着只有在将对象声明为IList的对象时才能看到属性。
答案 3 :(得分:0)
显式接口实现,如:
bool IList<T>.IsReadOnly { get; }