CSC和Roslyn编译器静态lambda表达式求值的差异

本文关键字:表达式 lambda Roslyn 编译器 静态 CSC | 更新日期: 2023-09-27 18:02:32

考虑以下示例代码:

class Program
{
    static void Main( string[] args )
    {
        DoSomethingWithAction( i =>
            {
                Console.WriteLine( "Value: {0}", i );
            } );
        Console.ReadLine();
    }
    private static void DoSomethingWithAction( Action<int> something )
    {
        Console.WriteLine( something.Target == null
            ? "Method is static."
            : "Method is not static." );
        something( 5 );
    }
}

如果我使用Visual Studio 2010(在CSC编译器下)在Debug下编译并运行此代码,它将打印出以下结果:

Method is not static.
Value: 5

如果我在Visual Studio 2010中编译相同的代码,但这次使用Release设置,将生成以下输出:

Method is static.
Value: 5
现在,如果我们要执行相同的代码,但这次使用Visual Studio 2015 CTP(在Roslyn编译器下),将为DebugRelease设置生成以下输出:

Method is not static.
Value: 5

首先,我发现很奇怪的是VS2010 (CSC)的调试和发布版本之间存在差异。为什么它在调试时不作为静态方法进行评估?此外,在某些情况下,它在调试中编译时确实作为静态计算。我有一个生产应用程序,在Debug下得到预期的静态结果。

其次, Roslyn编译器是否应该匹配CSC在这种特殊情况下的行为?

CSC和Roslyn编译器静态lambda表达式求值的差异

这是Roslyn团队故意做出的改动。

指向实例方法的委托调用起来稍微快一些,所以Roslyn现在将lambdas编译为实例方法,即使它不需要。

看到讨论。