Разница в оценке статического лямбда-выражения 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, но на этот раз с использованием параметров выпуска, будет сгенерирован следующий вывод:

Method is static.
Value: 5

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

Method is not static.
Value: 5

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

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

1 ответ

Решение

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

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

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

Другие вопросы по тегам