Difference in CSC and Roslyn compiler's static lambda expression evaluation?

↘锁芯ラ 提交于 2019-11-27 07:47:06

问题


Consider the following example code.

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 );
    }
}

If I compile and run this code under Debug using the Visual Studio 2010 (under CSC compiler) it will print out the following result:

Method is not static.
Value: 5

If I compile the same code in Visual Studio 2010, but this time using Release settings, the following output will be generated:

Method is static.
Value: 5

Now, if we were to execute the same code but this time using Visual Studio 2015 CTP (under the Roslyn compiler), the following output is generated for both Debug and Release settings:

Method is not static.
Value: 5

First, I find it curious that there is a difference between the Debug and Release versions of VS2010 (CSC). Why would it not evaluate as a static method under debug? Also, it appears that under some cases it does evaluate as static when compiled in Debug. I have a production application that is getting the expected static result under Debug.

Secondly, should the Roslyn compiler match the behavior of CSC in this particular case?


回答1:


This was a deliberate change made by the Roslyn team.

Delegates that point to instance methods are slightly faster to invoke, so Roslyn now compiles lambdas to instance methods even when it doesn't need to.

See discussion.



来源:https://stackoverflow.com/questions/31408767/difference-in-csc-and-roslyn-compilers-static-lambda-expression-evaluation

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!