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

时间:2019-02-06 23:20:00

标签: c# .net-core

当我忘记使用静态修饰符并将其简化为可复制的代码段时,偶然发现了这一点。运行时,以下内容将失败并显示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的误解?

2 个答案:

答案 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();

您创建一个程序,然后创建一个程序,然后再创建一个程序...等到无穷大。

我不确定您需要在这里完成什么,但是如果您需要在同一类中创建一个类的实例,那么我认为您最终需要打一个基本案例才能停止递归。