【发布时间】:2010-12-18 10:33:01
【问题描述】:
类型化数组实现了System.Collections.IList 和System.Collections.Generic.ICollection<T> 接口,它们都有自己的IsReadOnly 属性。但是这里到底发生了什么?
var array = new int[10];
Console.WriteLine(array.IsReadOnly); // prints "False"
var list = (System.Collections.IList)array;
Console.WriteLine(list.IsReadOnly); // prints "False"
var collection = (System.Collections.Generic.ICollection<int>)array;
Console.WriteLine(collection.IsReadOnly); // prints "True"
数组的IList 视图的行为与我预期的一样,返回的结果与数组本身相同,但是数组的ICollection<T> 视图返回true。
对这种行为有任何合理的解释,还是编译器/CLR 错误? (如果是后者,我真的会很惊讶,因为你想象这会在现在之前被发现,但它太违反直觉了,我想不出解释会是什么......)。
我正在使用 C#3.0/.NET 3.5 SP1。
【问题讨论】:
-
有趣的是,两者的注释都说“只读的集合不允许在集合创建后添加、删除或修改元素。”。而且我认为逻辑等同于 IsReadOnly = !CanAdd || !可以删除 || !CanEdit 应该返回 true,因为您可以替换列表指定索引处的值。
-
一个但更多,但 Array.IsReadonly 文档是明确的..“对于所有数组,此属性始终为 false。” “Array 实现 IsReadOnly 属性,因为 System.Collections..::.IList 接口需要它。如果需要只读集合,请使用实现 System.Collections..::.IList 的 System.Collections 类接口。只读数组不允许在数组创建后添加、删除或修改元素。"