为什么List <t>实现IList <t>,ICollection <t>和IEnumerable <t>?</t> </t> </t> </t>

时间:2010-07-11 17:59:19

标签: c#

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

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

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

如果List<T>仅实施IList<T>

,那还不够

4 个答案:

答案 0 :(得分:17)

是的,在这种情况下没有任何区别。在某些情况下,可以有所作为,如果您使用的是已经实现了接口的基类,但您希望自己重新实现它 - 但在这种情况下,没有基类(除了隐式object)并且它的行为方式完全相同。

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

interface IFoo {}
interface IBar : IFoo {}

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

ildasm和Reflector都显示FooBar1FooBar2的相同信息...它显示了实现IBarIFoo的所有信息。

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

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:4)

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

答案 3 :(得分:0)

如果您查看了源代码:

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

您可以看到签名是:

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

这仅意味着元数据浏览器为我们取消了继承层次结构的规范化。