【发布时间】:2013-01-11 14:47:45
【问题描述】:
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 也会出现同样的问题。
【问题讨论】:
-
@JonSkeet 我认为他的文章有误。 Ienumerable 是协变的而不是逆变的。 .在文章中搜索这个确切的短语:“事实证明,唯一可行的通用接口是 IEnumerable
,因为只有 IEnumerable 是逆变的:” -
不要担心你在数学上的困难。我能向你保证,我的依然更好。 阿尔伯特爱因斯坦,为您的指导
:D -
@RoyiNamir:是的,我认为你是对的 - 但文章的其余部分仍然合适。
-
@Nafeez Abrar:您需要解决的实际问题是什么?
标签: c# .net generics library-design