的indexer与明确的实施接口的实现,所以你只能将能够访问它,如果你这样做:
IList<int> b = new ReadOnlyCollection<int>(new[] { 2, 4, 2, 2 });
b[2] = 3;
或
var b = new ReadOnlyCollection<int>(new[] { 2, 4, 2, 2 });
((IList<int>)b)[2] = 3;
当然,它会失败,然后在执行时...
这完全是蓄意的,有帮助的 - 这意味着,当编译器知道这是一个ReadOnlyCollection
,功能不支持位是不可用对你有帮助,可以让你远离执行时间的失败。
虽然这是一个有趣且相对不寻常的步骤,但实际上隐式地实现了属性/索引器的一半,明确地实现了一半属性/索引器。
相反,我以前的想法,我相信ReadOnlyCollection<T>
实际上明确地实现了整个索引,但还提供公共只读索引。换句话说,它是这样的:
T IList<T>.this[int index]
{
// Delegate interface implementation to "normal" implementation
get { return this[index]; }
set { throw new NotSupportedException("Collection is read-only."); }
}
public T this[int index]
{
get { return ...; }
}
好的,但我如何使用显式实现复制ReadOnlyCollection的功能。我看不出如何从界面中删除方法或属性。 – 2009-09-11 09:47:04
@EsbenP:你不能从接口中移除一个方法......但是你可以只在引用的静态类型是接口而不是实现接口的类时才可用。 – 2009-09-11 10:14:42
好吧,如果我有两个索引,他们实施的IList的一个明确它的工作原理 牛逼的IList。这[INT指数] { 得到 { 返回源[指数] } set { throw new NotImplementedException(); } } 公共Ť此[INT指数] { 得到 { 返回源[指数]; } } –
2009-09-11 10:23:12