如果你去定义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都显示相同的信息FooBar1和FooBar2...它显示了它们的实现IBar和IFoo.
换句话说,我们无法判断原始源代码是否List<T>实际指定了所有接口.也许它确实如此,也许它没有 - 但无论如何都无所谓.
编辑:为了完整性,我还检查了你用另一个接口扩展两个接口的情况.在这种情况下,我也无法找到元数据的差异.我确信我记得有些情况很明显,但我现在找不到它.
是的,它会的.IList<T>本身实现了另外两个.
对象浏览器会显示所有接口的类实现,无论是直接(IList<T>)或间接(ICollection<T>,IEnumerable<T>,通过 IList<T>).