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&lt;T&gt; 必须明确派生自ICollection&lt;T&gt;, IEnumerable&lt;T&gt;, IEnumerable, 以及派生自IList&lt;T&gt;,而IList&lt;T&gt; 本身派生自ICollection&lt;T&gt;, IEnumerable&lt;T&gt;, 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&lt;T&gt; 不需要显式派生自 ICollection&lt;T&gt; 和其他人。不是。

【讨论】:

【参考方案2】:

对象浏览器或反射器或类似的没有源代码,它们有元数据可以使用。如果一个类型直接实现了一个接口,那么检查这些信息并不容易,所以最简单的选择是,因为最终目标是文档,所以即使有些接口是多余的,也可以简单地显示所有接口。

欲了解更多信息,请阅读this。

【讨论】:

以上是关于List<T> 派生自 IList<T> 和 IEnumerable<T>,没用?的主要内容,如果未能解决你的问题,请参考以下文章

C# IList<T>的用法?

IList与List的区别

IList<T> 到 IQueryable<T>

C#利用GridView对IList<T>或List<T>进行插入、删除和修改

C# List<T;用法

如何对 IList<T> 执行二进制搜索?