为什么IList 实现IEnumerable 和ICollection 而ICollection 本身实现IEnumerable

为什么IList这样定义?

public interface IList : ICollection, IEnumerable, IEnumerable public interface ICollection : IEnumerable, IEnumerable public interface IEnumerable : IEnumerable 

不可能只是

 public interface IList : ICollection 

所以,为了测试我创建了这些接口,只是为了确定它是否有效!

 public interface IOne { string One(); } public interface ITwo : IOne { string Two(); } public interface IThree : ITwo, IOne { string Three(); } 

虽然完美无瑕,但Resharper抱怨“冗余接口”。

有什么想法为什么微软继续这个实现?

接口“inheritance”是软件工程中最具误导性的术语之一。 你没有inheritancesquat,接口没有任何实现,所以你也不能inheritance它。 您只inheritance实现方法的需求

通过重复接口声明来增加这种需求并没有改变任何东西,你已经有了需求并且增加额外的需求没有任何区别。 因此,无论如何,微软都可以重复使用界面,这样您就可以一举告知List实现了哪些接口。 您不必深入查看接口声明,以查看List是否也实现了IEnumerable。 它是一种自我记录的编码风格,推荐使用。

要注意这个奖章的另一面,只需一个方法实现就可以实现具有完全相同方法的两个不同的接口。 虽然这通常很有用,但有时候并不是你想要的。 比如,ICowboy和IPainter,他们都有一个Draw()方法。 它不应该做同样的事情:)然后你必须回到显式实现,以避免歧义。

解决Resharper投诉,当然不是很有帮助。 Resharper倾向于承担程序员的最坏情况。 但是如果你想关闭它,那么你需要从IThreeinheritance列表中删除IOne,这是多余的。 对于实现IThree的类,同样的事情,您还需要从inheritance列表中删除ITwo和IOne​​。 或者只是关闭警告。