6

考虑这段代码:

    private static int i = 0;

    static void Main(string[] args)
    {
        DoSomething();
        Console.ReadLine();
    }

    public static void DoSomething()
    {
        Console.WriteLine(i);
        ++i;
        DoSomething();
    }

每次我运行它时,我都会得到StackOverflowException不同的i变量值。例如160231620016071

这背后的原因是什么?它是 C# 编译器中的错误吗?

4

2 回答 2

4

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

于 2013-06-15T08:19:28.343 回答
1

你的堆栈大小不够大。

您可以通过启动新线程并在构造函数中定义新的堆栈大小来增加默认堆栈大小:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace ConsoleApplication3
{
class Program
{
    private static int i = 0;

    static void Main(string[] args)
    {
        Thread T = new Thread(DoSomething, 100000000);
        T.Start();
        Console.ReadLine();



    }

    public static void DoSomething()
    {
        Console.WriteLine(i);
        ++i;
        DoSomething();
    }

 }
}

Stackoverflow 现在发生在 150 万次递归调用中。

于 2013-06-15T08:00:26.373 回答