请参见System.Array类的定义
public abstract class Array : IList, ...
从理论上讲,我应该能够写这篇文章并感到高兴
int[] list = new int[] {};
IList iList = (IList)list;
我也应该能够从iList调用任何方法
ilist.Add(1); //exception here
我的问题不是为什么我会得到异常,而是为什么Array实现IList?
因为数组允许按索引快速访问,并且IList
/ IList<T>
是唯一支持此功能的集合接口。因此,也许您真正的问题是“为什么没有索引器的常量集合的接口?”对此我没有答案。
也没有用于集合的只读接口。而且我甚至缺少那些带有索引器接口的恒定大小的东西。
IMO,应根据集合的功能,再有几个(通用)集合接口。而且名称也应该有所不同,List
对于带有索引器的东西来说确实是愚蠢的IMO。
IEnumerable<T>
ICollection<T>
] >>IList<T>
的可变大小我认为当前的收集接口设计不好。但是,由于它们具有告诉您哪些方法有效的属性(这是这些方法的约定的一部分),因此不会违反替代原理。
[documentation的IList
的备注部分说]
因为并非所有IList
都是可变的
这是我们从不清楚如何处理只读集合以及Array是否为只读时代起就拥有的遗产。 IList接口中有IsFixedSize和IsReadOnly标志。 IsReadOnly标志意味着完全不能更改集合,而IsFixedSize意味着该集合允许修改,但不允许添加或删除项。
IList接口的定义是“表示可以由索引单独访问的对象的非通用集合。”数组完全满足此定义,因此必须实现接口。调用Add()方法时出现异常“ System.NotSupportedException:集合的大小是固定的”,并且由于数组无法动态增加其容量而发生。其容量是在创建数组对象时定义的。