7

ReadOnlyCollection<T>实现了ICollection<T>具有 Add 和 Remove 等方法的接口。我知道如何使用属性从 Intellisense 隐藏方法,但是如果我尝试使用这些方法,怎么可能导致实际的编译错误呢?

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

4

2 回答 2

17

它们是通过显式接口实现来实现的,如下所示:

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
于 2010-11-08T07:56:44.167 回答
2

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

于 2010-11-08T08:01:31.910 回答