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>
来代替IList<T>
实际上是一个糟糕的编程实践,不能满足所有目的。
如果.NET想要提供灵活性,即不是每个IList<T>
实现都必须具有非泛型实现(即IList
)的契约,则为什么他们没有保留另一个接口,该接口同时实现了泛型和非泛型版本,并建议所有希望对泛型和非泛型项进行契约的具体类通过该接口进行契约。
将ICollection<T>
强制转换为ICollection
和IDictionary<TKey,TValue>
强制转换为IDictionary
也会出现同样的问题。
:D
- spajce