对于声明视角,允许以下内容
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吗?
答案 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()。