固定大小到列表

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

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

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

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

 IList fruits=new List(); 

在这里,我将List分配给IList,我可以分配给IList的各种集合类有哪些?

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

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

至于可分配给IList类型的问题,实际上有很多包括: ReadOnlyCollectionCollection 。 这个清单太长了,无法放在这里。 查看所有内容的最佳方法是在reflection器中打开IList并查找IList派生类型。

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

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

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

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

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

但那么让它成为IList的重点是什么? 你仍然无法添加它。 如果它确实是一个固定大小的列表,那么使它成为一个字符串[]。 否则,像杰克建议的那样使它成为List()。