![](/img/trans.png)
[英]"Process is terminating due to StackOverflowException", reason for it in the following code
[英]Process is terminating due to StackOverflowException on calling GetType()
当我忘记使用静态修饰符并将其简化为可复制的代码段时,我无意间遇到了这个问题。 运行时,以下将失败并显示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的误解?
令人讨厌的行不是p.GetType()
,而是Program
的类型初始值设定项。
创建程序实例时, var p = new Program();
它运行Program
的初始化Program
来设置新实例。 这包括运行对Program
字段的所有分配。
此初始化字段是罪魁祸首:
Program program = new Program();
要创建Program
的实例,必须通过创建Program
的新实例来初始化现场program
。 这将导致无限的初始化程序堆栈,并生成您的StackOverflowException
。
我认为它将递归地尝试创建新的Program()对象,直到由于行而导致堆栈溢出:
class Program
{
Program program = new Program();
您创建一个程序,然后创建一个程序,然后创建一个程序...等到无穷大。
我不确定您需要在这里完成什么,但是如果您需要在同一类中创建一个类的实例,那么我会假设您最终需要打一个基本案例才能停止递归。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.