当我忘记使用静态修饰符并将其简化为可复制的代码段时,偶然发现了这一点。运行时,以下内容将失败并显示StackOverflowException:
namespace test
{
class Program
{
Program program = new Program();
public static void Main(string[] args)
{
var p = new Program();
System.Console.WriteLine(p.GetType());
}
}
}
这为什么会失败?是错误还是我对CLR的误解?
答案 0 :(得分:3)
违规行不是p.GetType()
,而是Program
的类型初始值设定项。
创建程序实例var p = new Program();
时,它将运行Program
的初始化程序来设置新实例。这包括运行对Program
字段的所有分配。
此初始化字段是元凶:
Program program = new Program();
要创建Program
的实例,必须通过创建program
的新实例来初始化字段Program
。这将导致无限的初始化程序堆栈,并生成您的StackOverflowException
。
答案 1 :(得分:2)
我认为它将递归地尝试创建新的Program()对象,直到由于行而导致堆栈溢出:
class Program
{
Program program = new Program();
您创建一个程序,然后创建一个程序,然后再创建一个程序...等到无穷大。
我不确定您需要在这里完成什么,但是如果您需要在同一类中创建一个类的实例,那么我认为您最终需要打一个基本案例才能停止递归。