Разница в 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 );
    }
}

Если я скомпилирую и запустил этот код под Debug с помощью Visual Studio 2010 (под компилятором CSC), он распечатает следующий результат:

Method is not static.
Value: 5

Если я скомпилирую тот же код в Visual Studio 2010, но на этот раз с помощью настроек Release будет создан следующий вывод:

Method is static.
Value: 5

Теперь, если бы мы должны были выполнить тот же код, но на этот раз с помощью Visual Studio 2015 CTP (в соответствии с компилятором Roslyn), следующий вывод создается как для Отладка, так и Release strong > :

Method is not static.
Value: 5

Во-первых, мне показалось любопытным, что существует разница между версиями отладки и выпуска VS2010 (CSC). Почему он не будет оцениваться как статический метод при отладке? Кроме того, похоже, что в некоторых случаях он оценивается как статический при компиляции в Debug. У меня есть производственное приложение, которое получает ожидаемый статический результат в Debug.

Во-вторых, должен ли компилятор Roslyn соответствовать поведению CSC в этом конкретном случае?

Ответ 1

Это было преднамеренное изменение, сделанное командой Roslyn.

Делегаты, которые указывают на методы экземпляра, несколько быстрее запускаются, поэтому Roslyn теперь компилирует методы lambdas к экземплярам, ​​даже когда это не нужно.

См. обсуждение.