C# 由于调用GetType()时出现StackOverflowException,进程正在终止

C# 由于调用GetType()时出现StackOverflowException,进程正在终止,c#,.net-core,C#,.net Core,我在忘记静态修饰符时偶然发现了这个问题,并将其简化为一个可复制的片段。运行StackOverflowException时,以下操作将失败: namespace test { class Program { Program program = new Program(); public static void Main(string[] args) { var p = new Program();

我在忘记静态修饰符时偶然发现了这个问题,并将其简化为一个可复制的片段。运行StackOverflowException时,以下操作将失败:

namespace test
{
    class Program
    {
        Program program = new Program();

        public static void Main(string[] args)
        { 
            var p = new Program();
            System.Console.WriteLine(p.GetType());
        }
    }
}

为什么会失败?这是一个bug还是我对CLR的误解?

我认为它会递归地尝试创建新的程序对象,直到堆栈因以下行而溢出:

class Program
{
    Program program = new Program();
你创建一个程序,然后它创建一个程序,然后它创建一个程序。。。等到无穷远

我不确定您需要在这里完成什么,但是如果您需要在同一个类中创建一个类的实例,我会假设您最终需要达到一个基本情况才能停止递归。

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

创建程序实例var p=new program时;它运行程序的初始值设定项来设置新实例。这包括运行程序字段的任何赋值

此初始化字段是罪魁祸首:

Program program = new Program();

要创建程序实例,必须通过创建新的程序实例来初始化字段程序。这会导致初始化器无限堆叠,并生成StackOverflowException。

请阅读指南-您拥有的代码仍然不是演示该问题的最低限度。这样做会大大改进问题,因为您不会真正提到无关的。请键入call,并可能帮助您自己发现问题。谢谢,我现在明白了