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?
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With