Работает ли 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 для каждой кошки, подобную этой
Теренс

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
Я думаю, мы можем сказать, что все синтаксические сахара могут быть использованы и нацелены на более старые версии фреймворка. это нормально говорить?
МКБ

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: \ Program Files (x86) \ MSBuild \ 14.0 \ Bin

[Rebuild.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.