考虑以下代码:
private static int i = 0;
static void Main(string[] args)
{
DoSomething();
Console.ReadLine();
}
public static void DoSomething()
{
Console.WriteLine(i);
++i;
DoSomething();
}
Run Code Online (Sandbox Code Playgroud)
每次运行它,我都会获得StackOverflowException不同的i变量值.例如16023,16200,16071.
这背后的原因是什么?这是C#编译器中的错误吗?
无界递归的行为是实现定义的。定义的实现意味着它可以做任何事情。程序可以随时终止(或永不终止)、抛出未处理的异常或其他任何情况。例如,编译为 MSIL 并在 64 位操作系统上运行,该程序永远不会终止。这是因为允许抖动将递归变成循环,64 位抖动就是这样做的。询问为什么它在特定值处终止没有实际意义,因为允许运行时执行任何操作。