C# 由于调用GetType()时出现StackOverflowException,进程正在终止
我在忘记静态修饰符时偶然发现了这个问题,并将其简化为一个可复制的片段。运行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();
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,并可能帮助您自己发现问题。谢谢,我现在明白了