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

Mar*_* M. 25 c#

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

public class List<T> : IList<T>, ICollection<T>, IEnumerable<T>
Run Code Online (Sandbox Code Playgroud)

IList<T>已经从两个继承ICollection<T>IEnumerable<T>.

如果List<T>只实施,那还不够IList<T>吗?

Jon*_*eet 17

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

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

interface IFoo {}
interface IBar : IFoo {}

class FooBar1 : IBar {}
class FooBar2 : IBar, IFoo {}
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • @Jon Skeet:我爱你.我想实现你的IBrain.我可以继承"你的"基类吗? (2认同)

Mau*_*Mau 5

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

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