Why array implements IList?

Because an array allows fast access by index, and IList/IList<T> are the only collection interfaces that support this. So perhaps your real question is “Why is there no interface for constant collections with indexers?” And to that I have no answer.

There are no readonly interfaces for collections either. And I’m missing those even more than a constant sized with indexers interface.

IMO there should be several more (generic) collection interfaces depending on the features of a collection. And the names should have been different too, List for something with an indexer is really stupid IMO.

  • Just Enumeration IEnumerable<T>
  • Readonly but no indexer (.Count, .Contains,…)
  • Resizable but no indexer, i.e. set like (Add, Remove,…) current ICollection<T>
  • Readonly with indexer (indexer, indexof,…)
  • Constant size with indexer (indexer with a setter)
  • Variable size with indexer (Insert,…) current IList<T>

I think the current collection interfaces are bad design. But since they have properties telling you which methods are valid (and this is part of the contract of these methods), it doesn’t break the substitution principle.

Leave a Comment