Вопрос:

Работает ли C # 6.0 для .NET 4.0?

c# .net c#-6.0

69991 просмотра

5 ответа

6814 Репутация автора

Я создал пример проекта с вкусностями 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? Есть ли какие-либо ограничения или недостатки?

Автор: MajesticRa Источник Размещён: 08.03.2015 12:22

Ответы (5)


28 плюса

102907 Репутация автора

Да, вы можете использовать новые компиляторы для более старых платформ и получить доступ к новым функциям компилятора (если эти функции не требуют новых типов, представленных в .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.

Автор: Scott Chamberlain Размещён: 08.03.2015 12:29

282 плюса

87221 Репутация автора

Решение

Да (в основном) 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}";

Случаи, которые вы упомянули, не нуждаются в типах из каркаса для работы. Таким образом, компилятор полностью поддерживает эти функции для старых версий фреймворка.

Автор: i3arnon Размещён: 08.03.2015 12:29

51 плюса

45464 Репутация автора

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

Когда Википедия говорит, что 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.

Автор: Lex Li Размещён: 08.03.2015 04:05

1 плюс

353 Репутация автора

Если вы используете сборочные атрибуты, не забудьте изменить путь к новому сборщику:

установить 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
Автор: oobe Размещён: 03.01.2018 10:08

1 плюс

21 Репутация автора

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

Автор: Suryakant Soni Размещён: 19.06.2018 08:25
32x32