任何人都可以向我解释为什么我想在C#中使用IList而不是List?
相关问题:为什么暴露它被认为是不好的List<T>
请参阅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?
IList<T>不继承IList那里IEnumerable<out T>继承IEnumerable.
如果out修正是唯一的原因,那么为什么大多数的实施IList<T>(例如Collection<T>,List<T>)实现IList接口.
所以任何人都可以说好,如果那些陈述对于所有的实现都是真的,IList<T>那么IList在必要时直接将其强制转换.但问题是虽然IList<T>没有继承IList所以不能保证每个IList<T>对象都是IList.
此外,使用IList<object>显然不是解决方案,因为没有out修饰符泛型不能分配给较少的继承类; 并且创建List的新实例在这里不是解决方案,因为有人可能想要实际引用IList<T>作为IList指针; 并且使用List<T>insteed IList<T>实际上是一种糟糕的编程习惯,并不能用于所有目的.
如果.NET希望提供灵活性,每个实现IList<T>都不应该有非泛型实现的合同(即IList)那么为什么他们没有保留另一个实现泛型和非泛型版本的接口,并没有暗示所有具体的想要签订通用和非遗传项目的类应通过该接口签订合同.
发生铸造同样的问题ICollection<T>,以ICollection及IDictionary<TKey, TValue>对IDictionary.