相关疑难解决方法(0)

技术原因是C#没有发出"尾巴".CIL指令?

可能重复:
为什么.net/C#不会消除尾递归?

请使用以下C#代码:

using System;

namespace TailTest
{
    class MainClass
    {
        public static void Main (string[] args)
        {
            Counter(0);
        }

        static void Counter(int i)
        {
            Console.WriteLine(i);
            if (i < int.MaxValue) Counter(++i);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

C#编译器(无论如何)我会将Counter方法编译成以下CIL:

.method private static hidebysig default void Counter (int32 i) cil managed 
{
.maxstack 8
IL_0000:  ldarg.0 
IL_0001:  call void class [mscorlib]System.Console::WriteLine(int32)
IL_0006:  ldarg.0 
IL_0007:  ldc.i4 2147483647
IL_000c:  bge IL_0019
IL_0011:  ldarg.0 
IL_0012:  ldc.i4.1 
IL_0013:  add 
IL_0014:  call void class TailTest.MainClass::Counter(int32)
IL_0019:  ret 
}
Run Code Online (Sandbox Code Playgroud)

上面代码的问题是它会导致堆栈溢出(在我的硬件上约为i = …

.net c# mono compiler-optimization tail-call-optimization

26
推荐指数
2
解决办法
1305
查看次数