你有任何想法,为什么以下代码:
public class A
{
public static int i = B.i + 1;
}
public class B
{
public static int i = A.i + 1;
}
Run Code Online (Sandbox Code Playgroud)
有:
int aa = A.i;
int bb = B.i;
Run Code Online (Sandbox Code Playgroud)
说aa = 2(!!!)和bb = 1.
我脑子里有一个堆叠溢出!据我所知,递归在静态方法上停止,但为什么呢?如果你将int i重新编写为getter(为了调试并理解它为什么会这样工作),你会得到堆栈溢出异常.
毫无疑问,执行就像这样:
在B.i静态初始化首先运行,并设置B.i = A.i + 1.既然A.i尚未初始化,A.i则等于default(int),即0. B.i获得价值1.
在A.i静态初始化运行第二个,并设置A.i = B.i + 1 = 2.
由于静态初始化程序以未定义的顺序运行,因此您可能会发现2每次运行时都有一个不同的字段,或者当您对代码进行其他结构更改时它们会切换.但是,人们应该总是这样2,而且应该永远都是1.
PS这与多态性无关.
编辑: 为了进一步了解静态初始化器和构造函数的时序,您可能需要检查C#规范的相关部分.