c# - 由于调用 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的误解?
解决方案
有问题的行不是p.GetType()
,而是 的类型初始值设定项Program
。
当您创建程序实例var p = new Program();
时,它会运行初始化程序Program
来设置新实例。这包括对Program
.
这个初始化的字段是罪魁祸首:
Program program = new Program();
要创建 的实例,您必须通过创建 的新实例来Program
初始化字段。这会导致无限堆栈的初始化程序并生成您的.program
Program
StackOverflowException
推荐阅读
- python - 找到 3 个变量的最大奇数 - 反馈
- django-allauth - 如何将 Google One Tap 登录与 django-allauth 集成?
- reactjs - Firebase,React:如何在客户端显示 http 错误?
- python - 使用函数制作“折叠列表”
- c# - 如何创建带参数的函数以在对象列表中查找特定对象
- javascript - 如何在 Chrome 或 Firefox 中监控或分析 DOM 更新?
- c# - 在 SqlBulkCopy.WriteToServer 异常上查找失败的行并通过省略那些失败的行来重试 SqlBulkCopy
- excel - Excel 数据表示,轴标签非数字
- mysql - 如何在 MySQL 中循环遍历 JSON 数据
- python - 如何为 forms.ChoiceField() 设置默认值?