繁体   English   中英

为什么列表 <T> 实现IList <T> ,ICollection <T> 和IEnumerable <T> ?

[英]Why does List<T> implement IList<T>, ICollection<T> and IEnumerable<T>?

如果你去定义List<T>你会看到以下内容:

public class List<T> : IList<T>, ICollection<T>, IEnumerable<T>

IList<T>已经从ICollection<T>IEnumerable<T>继承。

如果List<T>只实现了IList<T>那还不够吗?

是的,在这种情况下没有任何区别。 在某些情况下,如果您使用的是已经实现了接口的基类,但是您希望自己重新实现它,那么它可能会有所不同 - 但在这种情况下,没有基类(除了隐式object )并且它会有表现完全一样。

与我的回忆相反,我认为无论代码是否明确声明所有接口,在元数据中表示类的方式都有所不同。 这是一个例子:

interface IFoo {}
interface IBar : IFoo {}

class FooBar1 : IBar {}
class FooBar2 : IBar, IFoo {}

ildasm和Reflector都显示了与FooBar1FooBar2相同的信息......它显示了它们都实现了IBarIFoo

换句话说,我们无法判断List<T>的原始源代码是否实际指定了所有接口。 也许它确实如此,也许它没有 - 但无论如何都无所谓。

编辑:为了完整性,我还检查了你用另一个接口扩展两个接口的情况。 在这种情况下,我也无法找到元数据的差异。 我确信我记得有些情况很明显,但我现在找不到它。

是的,它会的。 IList<T>本身实现了另外两个。

对象浏览器向您显示该类实现的所有接口,无论是直接( IList<T> )还是间接( ICollection<T>IEnumerable<T>通过 IList<T> )。

这不是它在幕后实际编码的方式。 这就是Reflector等工具在将IL转回C#时向您展示的内容。

如果查看源代码:

https://referencesource.microsoft.com/#mscorlib/system/collections/generic/list.cs

您可以观察到签名是:

public class List<T> : IList<T>, System.Collections.IList, IReadOnlyList<T>

这只能意味着元数据浏览器会为我们对继承层次结构进行反规范化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM