繁体   English   中英

由于调用GetType()的StackOverflowException,进程正在终止

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM