首页 > 解决方案 > 由于调用 GetType() 时出现 StackOverflowException,进程正在终止

问题描述

我在忘记静态修饰符并将其简化为可重现的片段时偶然遇到了这个问题。以下将在运行时失败并出现 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的误解?

标签: c#.net-core

解决方案


有问题的行不是p.GetType(),而是 的类型初始值设定项Program

当您创建程序实例var p = new Program();时,它会运行初始化程序Program来设置新实例。这包括对Program.

这个初始化的字段是罪魁祸首:

Program program = new Program();

要创建 的实例,您必须通过创建 的新实例来Program初始化字段。这会导致无限堆栈的初始化程序并生成您的.programProgramStackOverflowException


推荐阅读