Подтвердить что ты не робот

Как скомпилировать С# с определенной версией языка

Скажем, я хочу, чтобы кто-то рассказал о различиях между foreach в С# 4.0 и 5.0.

Итак, я пишу свой фрагмент кода:

public static void Main()
{
    string[] fruits = { "Apple", "Banana", "Cantelope" };
    var actions = new List<Action>();
    foreach (var fruit in fruits)
    {
        actions.Add(() => Console.WriteLine(fruit));
    }

    foreach(var a in actions)
    {
        a();
    }   
}

Но независимо от того, как я его скомпилирую, он всегда работает так, как в 5.0 *. Я попытался установить языковой вариант в файле csproj (Build → Advanced → Language Version), и я попытался просто создать его в командной строке:

csc myProgram.cs /langversion:4

Я не могу заставить его работать "старым" способом. Любая помощь? Бонусные баллы, если вы можете сказать мне, как это сделать как в командной строке, так и в Visual Studio.

* Для тех, кто не знает, на С#. <= 4.0 это напечатало бы Cantelope Cantelope Cantelope, а в С# 5.0+ оно (более интуитивно) напечатало бы Apple Banana Cantelope. Здесь ссылка и здесь еще.

4b9b3361

Ответ 1

Цель /langversion заключается только в том, чтобы заставить компилятор принять конкретные языковые конструкции. Это не влияет на фактическое поведение компилятора.

В документации указано, что:

Заставляет компилятор принимать только синтаксис, который включен в выбранную спецификацию языка С#.

и

Поскольку каждая версия компилятора С# содержит расширения для спецификации языка, /langversion не дает вам эквивалентную функциональность более ранней версии компилятора.

Итак, чтобы продемонстрировать различное поведение, вам придется использовать другой файл csc.exe, установленный с правильными версиями фреймворка.

C:\Windows\Microsoft.NET\Framework\v3.5>csc /out:c:\temp\foo-35.exe c:\temp\foo.cs
Microsoft (R) Visual C# 2008 Compiler version 3.5.30729.7903
for Microsoft (R) .NET Framework version 3.5
Copyright (C) Microsoft Corporation. All rights reserved.


C:\Windows\Microsoft.NET\Framework\v3.5>c:\temp\foo-35.exe
Cantelope
Cantelope
Cantelope