CSC和Roslyn编译器的静态lambda表达式评估的区别?

del*_*eyk 6 c# csc roslyn

请考虑以下示例代码.

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 );
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Method is not static.
Value: 5
Run Code Online (Sandbox Code Playgroud)

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

Method is static.
Value: 5
Run Code Online (Sandbox Code Playgroud)

现在,如果我们要使用Visual Studio 2015 CTP(在Roslyn编译器下)执行相同的代码,则会为DebugRelease设置生成以下输出:

Method is not static.
Value: 5
Run Code Online (Sandbox Code Playgroud)

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

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

SLa*_*aks 12

这是罗斯林团队的刻意改变.

指向实例方法的代理调用稍微快一些,因此Roslyn现在将lambdas编译为实例方法,即使它不需要.

讨论.