当IsReadOnly是接口成员时,List <t>如何使IsReadOnly成为私有的?</t>

时间:2009-05-02 13:53:56

标签: c# .net

我正在创建一个专门的代理类来实现IList<T>并包装一个内部List<T>实例。

List<T>本身实现了IList<T>,它声明了一个成员 bool IsReadOnly ,但是当我尝试从我自己的类中访问该成员时,我不能因为{ {1}},IsReadOnly是私有的。

所以我的问题是;如果接口的实现要求所有已实现的成员都是公共的,为什么List<T>将IsReadOnly实现为私有,从而拒绝我访问它?

3 个答案:

答案 0 :(得分:24)

它显式实现了接口成员。

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

请注意,这不会使接口成员private。它仍然是公开的,但只有当你通过界面查看对象时(使用强制转换)。

答案 1 :(得分:14)

它能够做到这一点的原因是它使用显式接口实现。

bool IList<T>.IsReadOnly { get { ... } }

此成员仍可访问,但只能通过IList<T>类型访问。

List<T> list = ...;
bool isReadOnly = ((IList<T>)list).IsReadOnly;

实现IList<T>时,该类型未承诺提供IsReadOnly值本身。相反,它被承诺在被视为IList<T>时提供IsReadOnly属性。它是否在实际类中提供它纯粹是类型作者的选择。

答案 2 :(得分:6)

对于List<T>的情况,IsReadOnly实际上没有意义:它总是false。因此,List显式实现ICollection<T>(和IList)接口,从而使接口“私有”以供正常使用。如果你还需要访问它,你可以通过显式转换到界面:

bool result = ((ICollection<string>)yourStringList).IsReadOnly;
// Or equivalently using `IList`.