为什么数组实现IList?

问题描述 投票:135回答:5

请参见System.Array类的定义

public abstract class Array : IList, ...

从理论上讲,我应该能够写这篇文章并感到高兴

int[] list = new int[] {};
IList iList = (IList)list;

我也应该能够从iList调用任何方法

 ilist.Add(1); //exception here

我的问题不是为什么我会得到异常,而是为什么Array实现IList

c# arrays ilist liskov-substitution-principle
5个回答
90
投票

因为数组允许按索引快速访问,并且IList / IList<T>是唯一支持此功能的集合接口。因此,也许您真正的问题是“为什么没有索引器的常量集合的接口?”对此我没有答案。

也没有用于集合的只读接口。而且我甚至缺少那些带有索引器接口的恒定大小的东西。

IMO,应根据集合的功能,再有几个(通用)集合接口。而且名称也应该有所不同,List对于带有索引器的东西来说确实是愚蠢的IMO。

  • 仅枚举IEnumerable<T>
  • 只读但没有索引器(.Count,.Contains,...)
  • 可调整大小但没有索引器,即设置为([添加,删除...]当前ICollection<T>] >>
  • 带索引器(索引器,indexof,...)的只读
  • 带索引器的恒定大小(带setter的索引器)
  • 带索引器(插入,...)当前IList<T>的可变大小
  • 我认为当前的收集接口设计不好。但是,由于它们具有告诉您哪些方法有效的属性(这是这些方法的约定的一部分),因此不会违反替代原理。


39
投票

[documentationIList的备注部分说]


17
投票

因为并非所有IList都是可变的


5
投票

这是我们从不清楚如何处理只读集合以及Array是否为只读时代起就拥有的遗产。 IList接口中有IsFixedSize和IsReadOnly标志。 IsReadOnly标志意味着完全不能更改集合,而IsFixedSize意味着该集合允许修改,但不允许添加或删除项。


0
投票

IList接口的定义是“表示可以由索引单独访问的对象的非通用集合。”数组完全满足此定义,因此必须实现接口。调用Add()方法时出现异常“ System.NotSupportedException:集合的大小是固定的”,并且由于数组无法动态增加其容量而发生。其容量是在创建数组对象时定义的。

© www.soinside.com 2019 - 2024. All rights reserved.