为什么静态字段初始化发生在静态构造函数之前?

以下代码:

static void Main(string[] args) { Console.WriteLine("0"); string h = Foo.X; Console.WriteLine("2"); } public static class Foo { public static string X = ((Func)delegate(string g) { Console.WriteLine(g); return (g); })("_aaa"); static Foo() { Console.WriteLine("ctor"); } } 

将打印:

 0 _aaa ctor 2 

我知道beforefieldinit行为(有/没有静态构造函数等)。

明白的是为什么ctor (在输出中)是 _aaa 之后

它没有任何意义,如果我想在构造函数中初始化变量怎么办?

为什么X的初始化在ctor之前?

ctor在字段初始化器之后的原因是因为它是指定的方式。 从C#规范(重点是我的):

10.5.5.1静态字段初始化类的静态字段变量初始值设定项对应于按照它们出现在类声明中的文本顺序执行的赋值序列。 如果类中存在静态构造函数(第10.12节),则在执行该静态构造函数之前立即执行静态字段初始值设定项。 否则,静态字段初始化器在第一次使用该类的静态字段之前的实现相关时间执行

如果要完全控制初始化顺序,请将其全部移到构造函数中。