c# - 如何在同一程序集中成功编译自引用 类 或循环引用 类

c# - How do self-referencing classes or circular-referencing classes within same assembly compile successfully

我想知道 C# 和 .Net 编译器如何能够在同一程序集中成功编译自引用 class 或循环引用 classes。

考虑以下代码存在于同一程序集中。

class X{ X x; }
class Y{ Z z; }
class Z{ Y y; }

当然,这段代码编译成功了。
但是如何?我想知道编译器是如何首次在这些情况下解析 classes 的。
例如,当编译器遇到 class Y 时,它还不知道 class Z。它如何能够解析 Class Y 中的子 属性 z?
请解释编译代码时后台究竟发生了什么。 可能有一些关于编译器如何解析 classes 和类型

的合适文章

this 文章中所述,C# 编译器执行 "Two Pass" 即

  1. 首先计算元数据:“顶层”的东西,比如命名空间、classes、结构、枚举、接口、委托、方法、类型参数、形式参数,构造函数、事件、属性等。

  2. 第二遍计算 IL:进入方法体、构造函数体等的代码。

C#编译方式不同于C/C++,其中class、方法、宏等在头文件中声明,这有助于它获得有关class、方法的所有信息只需读取头文件即可一次通过等。与 C# 相比,它没有头文件,而是使用 Two Pass 技术编译所有代码。