为何C#中SynchronizedCollection<T>的接口继承列表与源码定义不一致?
为什么SynchronizedCollection的类定义显示多接口,但源码只写两个?
这个问题其实涉及到.NET接口的继承层次和编码规范的小细节,我给你拆解清楚:
接口的继承链是核心原因
首先得明确.NET里这些接口的继承关系:- 泛型侧:
IList<T>直接继承了ICollection<T>和IEnumerable<T>,而ICollection<T>又继承了IEnumerable<T>。 - 非泛型侧:
IList直接继承了ICollection和IEnumerable。
也就是说,当一个类显式声明实现IList<T>和IList时,就已经间接承诺要实现所有父接口的成员了,完全不需要在类定义里把所有父接口都重复列出来。
- 泛型侧:
源码简洁性 vs 工具的完整展示
源码里只写直接实现的接口是.NET团队常用的编码规范——这样能让类定义更清爽,避免冗余的重复声明。但编译器、IDE(比如Visual Studio)或者反编译工具会自动把所有间接继承的接口都展示出来,因为从外部调用者的角度看,这个类确实需要满足所有这些接口的契约,得让开发者一眼清楚它支持的所有接口能力。实际实现的验证
你去看SynchronizedCollection的源码会发现,它确实实现了所有这些接口的成员:有些是通过泛型接口的实现(比如 IList<T>的Add(T))间接覆盖了ICollection<T>的要求,有些是通过显式接口实现来处理非泛型接口的方法(比如IList的Add(object)),只是这些实现不需要在类定义里把所有接口都列出来而已。
内容的提问来源于stack exchange,提问作者buciz
相关产品推荐
相关产品推荐

