我能够成功编译并运行以下程序:
class MyClass1
{
public static int x = y;
public static int y = 10;
}
static void Main(string[] args)
{
Console.WriteLine(MyClass1.x); //prints 0
Console.WriteLine(MyClass1.y); //prints 10
}
为什么要成功编译? x
在声明和初始化之前如何获得y
的值?如果是实例字段的情况,同样会得到编译时错误。
答案 0 :(得分:3)
来自ECMA-334 - 17.4.5.1静态字段初始化
类声明的静态字段变量初始值设定项 对应于在中执行的一系列赋值 它们出现在类声明中的文本顺序。如果一个 静态构造函数(第17.11节)存在于类中,执行 静态字段初始化程序在执行之前立即发生 静态构造函数。 否则,静态字段初始值设定项为 在第一次使用之前的执行相关时间执行 该类的静态字段。
因此y
变量在x
变量的初始化行中使用,并使用默认值0
初始化
答案 1 :(得分:0)
它们按顺序初始化。首先x
设置为y
的值,即0(默认值)。然后y
设置为10.