【问题标题】:List<T> derived from IList<T> and from IEnumerable<T>, useless?List<T> 派生自 IList<T> 和 IEnumerable<T>,没用?
【发布时间】: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# 代码。这是您的反编译器向您展示的内容。
  • 最终这只是你的反编译器有帮助。一口气告诉类实现了哪些接口非常有用。这样的声明是模棱两可的,是“接口继承”用词不当的副作用。 C# 语法让这看起来太像那种让你更富有的继承。用词不当,因为这实际上会使您在实现接口成员所需的更多工作上变得更穷。功能,而不是错误。

标签: c# derived-types


【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-28
      • 2011-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多