ReadOnlyCollection如何隐藏添加和删除方法

时间:2010-11-08 07:54:24

标签: c# interface readonly-collection

ReadOnlyCollection<T>实现ICollection<T>接口,其中包含添加和删除等方法。我知道如何使用属性从Intellisense隐藏方法,但是如果我尝试使用这些方法,怎么可能导致实际的编译错误?

(顺便说一句,我知道在ROC上调用Add和Remove是没有意义的,这是一个导致继承的memebers导致编译错误的问题,而不是使用正确的数据结构。)

2 个答案:

答案 0 :(得分:17)

它们是用explicit interface implementation实现的,如下所示:

void ICollection<T>.Add(T item) {
    throw NotSupportedException();
}

该方法仍可调用,但仅当您将对象视为ICollection<T>时才可调用。例如:

ReadOnlyCollection<int> roc = new ReadOnlyCollection<int>(new[] { 1, 2, 3 });
// Invalid
// roc.Add(10);

ICollection<int> collection = roc;
collection.Add(10); // Valid at compile time, but will throw an exception

答案 1 :(得分:2)

实际上,通过明确地从ICollection<T>接口实现这些方法,您无法直接调用它们 您必须明确地将对象(ReadOnlyCollection实例)强制转换为ICollection<T>。然后,您可以调用Add方法。 (因此,编译器不会抱怨,尽管你会得到一个运行时异常)。