ole*_*sii 137 c# arrays ilist liskov-substitution-principle
请参阅System.Array类的定义
public abstract class Array : IList, ...
Run Code Online (Sandbox Code Playgroud)
从理论上讲,我应该能够写下这一点,并感到高兴
int[] list = new int[] {};
IList iList = (IList)list;
Run Code Online (Sandbox Code Playgroud)
我也应该可以从iList中调用任何方法
ilist.Add(1); //exception here
Run Code Online (Sandbox Code Playgroud)
我的问题不是为什么我得到一个例外,而是为什么Array实现了IList?
Cod*_*aos 91
因为数组允许通过索引快速访问,所以IList/ IList<T>是唯一支持它的集合接口.所以也许你真正的问题是"为什么没有用于索引器的常量集合的接口?" 对此我没有答案.
集合也没有只读接口.而且我还缺少那些与索引器接口不变的常数.
IMO应该有几个(通用)集合接口,具体取决于集合的功能.而名称也应该有所不同,List因为索引器的东西真是愚蠢的IMO.
IEnumerable<T>ICollection<T>IList<T>我认为当前的集合接口是糟糕的设计.但由于它们具有告诉您哪些方法有效的属性(这是这些方法的合同的一部分),因此它不会破坏替换原则.
Bri*_*sen 40
在的备注部分文档的IList说
IList是ICollection接口的后代,是所有非泛型列表的基本接口. IList实现分为三类:只读,固定大小和可变大小.无法修改只读IList.固定大小的IList不允许添加或删除元素,但它允许修改现有元素.可变大小的IList允许添加,删除和修改元素.
显然,数组属于固定大小的类别,因此通过界面的定义,它是有意义的.
Meh*_*dad 17
因为并非所有ILists都是可变的(请参阅IList.IsFixedSize和IList.IsReadOnly),并且数组肯定表现得像固定大小的列表.
如果您的问题确实是"为什么它实现了非通用接口",那么答案就是这些问题出现在仿制药出现之前.
从不清楚如何处理只读集合以及Array是否为只读的时代开始,这就是我们的遗产。IList接口中有IsFixedSize和IsReadOnly标志。IsReadOnly标志意味着完全不能更改集合,而IsFixedSize意味着该集合允许修改,但不允许添加或删除项。
在.NET 4.5的时候,很明显,一些“中间”的接口都需要工作,只读集合,因此IReadOnlyCollection<T>并IReadOnlyList<T>进行了介绍。
这是一篇很棒的博客文章,描述了详细信息:.NET中的只读集合
| 归档时间: |
|
| 查看次数: |
22793 次 |
| 最近记录: |