List<T> 派生自 IList<T> 和 IEnumerable<T>,没用?
Posted
技术标签:
【中文标题】List<T> 派生自 IList<T> 和 IEnumerable<T>,没用?【英文标题】:List<T> derived from IList<T> and from IEnumerable<T>, useless? 【发布时间】:2018-01-05 10:13:21 【问题描述】:来自 mscorlib.dll:
public interface IList<T> : ICollection<T>, IEnumerable<T>, IEnumerable
..
public class List<T> : IList<T>, ICollection<T>, IEnumerable<T>, IEnumerable, IList, ICollection, IReadOnlyList<T>, IReadOnlyCollection<T>
...
为什么List<T>
必须明确派生自ICollection<T>, IEnumerable<T>, IEnumerable,
以及派生自IList<T>
,而IList<T>
本身派生自ICollection<T>, IEnumerable<T>, IEnumerable
?
【问题讨论】:
不,这不是来自 mscorlib.dll。 mscorlib.dll 不包含 C# 代码。这是您的反编译器向您展示的内容。 查看ReferenceSource 最终这只是你的反编译器有帮助。一口气告诉类实现了哪些接口非常有用。这样的声明是模棱两可的,是“接口继承”用词不当的副作用。 C# 语法让这看起来太像那种让你更富有的继承。用词不当,因为这实际上会使您在实现接口成员所需的更多工作上变得更穷。功能,而不是错误。 【参考方案1】:不要相信反编译的代码是原始源代码的准确表示。
The original source code 仅包含
public class List<T> : IList<T>, System.Collections.IList, IReadOnlyList<T>
所以是的,你说得对,List<T>
不需要显式派生自 ICollection<T>
和其他人。不是。
【讨论】:
【参考方案2】:对象浏览器或反射器或类似的没有源代码,它们有元数据可以使用。如果一个类型直接实现了一个接口,那么检查这些信息并不容易,所以最简单的选择是,因为最终目标是文档,所以即使有些接口是多余的,也可以简单地显示所有接口。
欲了解更多信息,请阅读this。
【讨论】:
以上是关于List<T> 派生自 IList<T> 和 IEnumerable<T>,没用?的主要内容,如果未能解决你的问题,请参考以下文章