固定大小到列表

时间:2009-10-26 14:54:08

标签: c# collections

对于声明视角,允许以下内容

    IList<string> list= new string[3];
    list.Add("Apple");
    list.Add("Manago");
    list.Add("Grapes");

1) 编译很好,但运行时我收到"Collection was of fixed size"错误。 当然,集合是按大小动态增长的,为什么这样的声明被编译器接受?

2)我可以分配给IList的不同列表是什么?    实施例

IList<string> fruits=new List<string>();

这里我将List分配给IList,各种集合是什么    类可以分配给IList吗?

3 个答案:

答案 0 :(得分:42)

这里的根本问题是System.Array通过实施IList<T>违反了替代原则。 System.Array类型具有固定大小,无法更改。 IList<T>上的Add方法旨在向基础集合添加一个新元素,并将其大小增加1.这对于System.Array是不可能的,因此它会抛出。

System.Array真正想要实现的是只读样式IList<T>。遗憾的是,框架中不存在这样的类型,因此它实现了下一个最好的东西:IList<T>

关于哪些类型可分配给IList<T>的问题,实际上有很多类型包括:ReadOnlyCollection<T>Collection<T>。这个清单太长了,无法放在这里。查看所有内容的最佳方法是在反射器中打开IList<T>并查找IList<T>的派生类型。

答案 1 :(得分:6)

当您调用list.Add时,您试图将一个项目插入到数组的末尾。数组是固定大小的集合,因此您无法执行添加。相反,您必须通过索引器分配条目:

list[0] = "a";
list[1] = "b";
list[2] = "c";

答案 2 :(得分:2)

@Jake:实际上一个字符串[]可以转换为IList ...但是你不能添加它。

如果您想预先填充列表,那么您可以使用以下内容:

IList<string> list= new string[3] { "Apple", "Mango", "Grapes" };

然后有什么意义使它成为IList?你仍然无法添加它。如果它确实是一个固定大小的列表,那么使它成为一个字符串[]。否则,按照杰克的建议,将其设为List()。