【发布时间】:2021-04-16 03:53:48
【问题描述】:
有趣的是,当我在 Visual Studio 中查看IList<T> 的定义时,它与 GitHub 上的源代码并不相同。
IList<T>
public interface IList<T> : ICollection<T>, IEnumerable<T>, IEnumerable
ICollection<T>
public interface ICollection<T> : IEnumerable<T>, IEnumerable
鉴于ICollection<T> 已经包含IEnumerable<T> 和IEnumerable 为什么IList<T> 需要包含它们。不能简化成下面这样吗?
public interface IList<T> : ICollection<T>
我试图理解这个长接口链背后的逻辑。
您可以查看下面的源代码以查看差异。
【问题讨论】:
-
我猜测一下,您已经使用 ILSpy 反编译了系统程序集,并看到
IList(或<T>)列出了一些接口。这是 ILSpy 的神器。如果一个类实现了 IA 并且 IA 暗示了 IB,ILSpy 会将该类列为实现 IA 和 IB。参考源、github、文档,都只列出了ICollection。 -
“定义”您从哪里或如何获得此定义?` 我们有参考源、github 源(适用于 .NET 5)、ILSpy、dotPeek、文档。此信息有很多来源,请告诉我们您使用了哪个。让我说得更清楚一点:其中一些来源不同,而一些(ILSpy)甚至可能是错误的。
-
@Alexander 这不是实际来源。那是元数据生成的代码。在 IL 中,所有接口都明确列出。请记住,接口是接口,就像墙上插座或音频插孔是接口一样。 3 针插座“继承”了 2 针插座接口。您仍然可以看到所有的孔和针脚。一个组合的麦克风+音频插孔“继承”了 2 个单声道和 1 个麦克风引脚。您仍然可以看到所有引脚,而不是“立体声”和“麦克风”引脚
-
Go to definition in Visual Studio 在后台使用ILSpy,ILSpy是错误的。它积极地将隐含的接口添加到类型中。您可以使用
public interface IA { } public interface IB : IA { } public class Test : IB { }对此进行测试,然后对其进行反编译。Test将被反编译显示为public class Test: IB, IA。这就是我们询问来源的原因。 -
ILSpy 不会返回源文件的准确副本。与原始源相比,有许多结构最终会成为不同的反编译源,这仅仅是因为编译器正在进行高级重写。因此,我不认为这是 ILSpy 的缺陷,它很可能完全按照设计工作。请注意,在我的
Test示例中,typeof(Test).GetInterfaces()返回IA和IB,ILDasm 也是如此。
标签: c# .net oop inheritance