Чи працює C # 6.0 для .NET 4.0?


275

Я створив зразок проекту, з прикладом C # 6.0 - нульове розповсюдження та ініціалізація властивостей як приклад, встановив цільову версію .NET 4.0 і це ... працює.

public class Cat
{
    public int TailLength { get; set; } = 4;

    public Cat Friend { get; set; }

    public string Mew() { return "Mew!"; }
}

class Program
{
    static void Main(string[] args)
    {
        var cat = new Cat {Friend = new Cat()};
        Console.WriteLine(cat?.Friend.Mew());
        Console.WriteLine(cat?.Friend?.Friend?.Mew() ?? "Null");
        Console.WriteLine(cat?.Friend?.Friend?.TailLength ?? 0);
    }
}

Чи означає це, що я можу використовувати функції C # 6.0 для мого програмного забезпечення, яке орієнтується на .NET 4.0? Чи є якісь обмеження чи недоліки?


7
.Net версії 2.0 - 3.5 використовують CLR v2.0. Новіші версії використовують CLR v4.0.
i3arnon

пам’ятайте про це, оптимізуйте мудро: ви додаєте окремий if-null-чек для кожної кішки, як це
Terence

2
Боже мій. Я розробляв WCF, орієнтований на v4.6, просто щоб "нагадати", що виробничий сервер не має бути оновлений до 2018 року. Я подумав, що на роботу, яка потребує місяця, знадобиться кілька днів рефакторингу. Завершено за п'ять хвилин. Дякую, Microsoft! : D
Ерік Ву

Відповіді:


286

Так (переважно). C # 6.0 вимагає нового компілятора Roslyn, але новий компілятор може компілювати націлювання на старіші версії рамок. Це обмежено лише новими функціями, які не потребують підтримки з боку основи .

Наприклад, хоча ви можете використовувати функцію інтерполяції рядків у C # 6.0 з більш ранніми версіями .Net (оскільки це призводить до виклику до string.Format):

int i = 3;
string s = $"{i}";

Вам потрібно .Net 4.6, щоб використовувати його, IFormattableоскільки додається лише нова версія рамки System.FormattableString:

int i = 3;
IFormattable s = $"{i}";

Вище згадані випадки для роботи не потребують типів із фреймворку. Тож компілятор цілком здатний підтримувати ці функції для старих версій фреймворку.


31
Насправді вам не потрібно .Net 4.6, лише кілька типів, які додаються в нього. Ви можете додати їх до старих рамок самостійно. Цей код чудово працює у .Net 4.0 та 3.5.
svick

10
Чи є десь список, щоб побачити, які функції C # 6 працюють у .NET 4.0? Інший спосіб задати це питання: які нові функції потребують підтримки з боку, а які - ні?
Рубенісме

1
@Rubenisme Я не можу придумати іншого, крім стропової IFormattableінтерполяції.
i3arnon

2
Я думаю, що ми можемо сказати, що всі синтаксичні цукри можуть бути використані та націлені на старіші версії рамок. це добре сказати?
mkb

4
@mkb так. Синтаксичний цукор - це саме ті особливості, які покладаються лише на можливості компілятора, а не на рамкові.
i3arnon

52

Просто хочу зосередитись на тому, як зрозуміти Вікіпедію та інші посилання.

Коли у Вікіпедії кажуть, що C # 6.0 є з .NET Framework 4.6, це просто означає, що виробнича версія компілятора (msc.exe) буде частиною випуску .NET Framework 4.6. Через багатоцільове націлювання такі компілятори можуть підтримувати нижчі версії версій .NET Framework. Звичайно, оскільки Roslyn став проектом з відкритим кодом, компілятор зараз є повністю індивідуальною складовою.

Якщо щось стосується CLR версії 4.0.30319 (.0), це насправді може бути .NET Framework 4. * (4.0, 4.0. *, 4.5, 4.5. *, 4.6, 4.6. *), Оскільки всі вони реалізують Специфікація CLR версії 4. Не кажучи вже про те, що Xamarin / Mono також реалізує ту саму специфікацію CLR.

Сторінка MSDN ще не повністю оновлена, але деяка сторінка вже є .NET Framework 4.6, зазначений у розділі Інформація про версію.

Загалом, мовні характеристики (як і компілятор C #), специфікації CLR та випуски .NET Framework не є щільно поєднані між собою. Це дає розробникам достатню гнучкість для використання нових компіляторів для націлювання на старі CLR та .NET Frameworks.


29

Так, ви можете використовувати новіші компілятори для старих фреймворків і отримувати доступ до нових функцій компілятора (до тих пір, поки ці функції не потребують нових типів, введених у .NET 4.6).

Іншими прикладами цього є методи з параметрами за замовчуванням, які були введені з C # 4.0 (.NET 4.0), але ви можете використовувати їх у проектах .NET 2.0 (C # 2.0) та .NET 3.5 (C # 3.0).

Ви також можете використовувати Методи розширення (впроваджені в C # 3.0) в .NET 2.0 або .NET 3.0, якщо ви зробите один невеликий вирішення для того, щоб зробити компілятор щасливим, щоб він міг знайти атрибут, який був введений в .NET 3.5.


1

Якщо ви використовуєте будівельні атрипти, не забудьте змінити шлях до нового конструктора:

встановити CPATH = C: \ програмні файли (x86) \ MSBuild \ 14.0 \ bin

[Відновити.bat]

set CPATH=C:\Program Files (x86)\MSBuild\14.0\Bin
call nuget_restore.bat
"%CPATH%\msbuild" YourSolution.sln /t:Rebuild /p:Configuration=Release /fileLogger /flp:logfile=JustErrors.log;errorsonly /verbosity:minimal

if %errorlevel% neq 0 goto ERROR

REM call deploy Release  //Things like deploy files..
goto END

:ERROR
       echo ERROR: %errorlevel%
       pause

:END

1

Відповідь @oobe насправді важлива. Я міг створити своє рішення через пакетний файл лише після використання MSBuild.exe з C: \ Program Files (x86) \ MSBuild \ 14.0 \ Bin .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.