为什么在不同的呼叫号码上抛出堆栈溢出异常?

6 c# stack-overflow recursion

考虑以下代码:

    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#编译器中的错误吗?

Mik*_*ray 4

无界递归的行为是实现定义的。定义的实现意味着它可以做任何事情。程序可以随时终止(或永不终止)、抛出未处理的异常或其他任何情况。例如,编译为 MSIL 并在 64 位操作系统上运行,该程序永远不会终止。这是因为允许抖动将递归变成循环,64 位抖动就是这样做的。询问为什么它在特定值处终止没有实际意义,因为允许运行时执行任何操作