Posted on 28. February 2019

Обновление C# версий и C# инструментов

 

Начиная с Visual Studio 2019 Preview 4 и RC, будет настроен способ обработки C# версий в .NET инструментах.

Итоги изменений

Во-первых, были добавлены два новых значения языковой версии (LangVersion): LatestMajor и Preview. Вот как они соответствуют поддерживаемому на данный момент списку значений:

LangVersion - Значение

LatestMajor - Последняя поддерживаемая C# версия

Preview - Последний доступный предварительный просмотр языковой C# версии

Latest - Последняя поддерживаемая языковая  C# версия (включая дополнительную версию)

ISO-1 - C# 1.0/1.2

ISO-2 - C# 2.0

3 - C# 3.0

4 - C# 4.0

5 - C# 5.0

6 - C# 6.0

7 - C# 7.0

7.1 - C# 7.1

7.2 - C# 7.2

7.3 - C# 7.3

8.0 - C# 8.0

Если LangVersion не указана, значение по умолчанию будет определяется целевой структурой Вашего проекта. Если Вы нацелены на структуру предварительного просмотра, которая также имеет соответствующую C# версию предварительного просмотра, эта версия будет использоваться по умолчанию. Если Вы не нацелены на предварительный просмотр, то выбирается Latest.

C# 8.0 в предварительном просмотре

Следующие сценарии объясняют, как дефолтная C# версия будет интерпретироваться, пока C# 8.0 все еще находится в режиме предварительного просмотра.

Предварительный просмотр netcoreapp3.0 preview или netstandard2.1

Дефолтная языковая версия в этом сценарии будет в качестве предварительного просмотра. Функции C# 8.0, к которым у Вас есть доступ, полностью основаны на используемой Вами версии компилятора (и, следовательно, .NET SDK). При использовании будущих предварительных просмотров Вы сможете получить еще больше функций. При сборки .NET SDK проекта Вы увидете уведомление о том, что это все еще предварительный просмотр.

.NET Framework

Дефолтная языковая версия, выбранная в этом сценарии, является Latest. Использование любой C# 8.0 функции будет ошибкой компиляции. Инструменты Visual Studio предложат Вам быстрое исправление, которое может изменить языковую версию проекта или решения при обнаружении одной из этих ошибок. Поскольку для некоторых функций требуются базовые типы или функции времени выполнения, которые недоступны в .NET Framework, такие как Default Interface Members, Вы все равно можете получить ошибку при ориентировке на .NET Framework.

Многоцелевой предварительный просмотр netcoreapp3.0 или netstandard2.1 и .NET Framework

Для таргетинга предварительного просмотра netcoreapp3.0/netstandard2.1 языковой версией будет Preview. При сборке из .NET SDK выдается предупреждение. Для таргетинга .NET Framework языковая версия является Latest.

Explicit LangVersion

Если Вы эксплицитно установите LangVersion значение, оно будет работать, а ранее упомянутое дефолтное поведение будет игнорироваться.

Если C# 8.0 и .NET Core 3.0 - GA

В конце концов, C# 8.0 и .NET Core 3.0 будут выпущены в версии GA-качества. Вот как соответствующие значения LangVersion будут сопоставляться:

LangVersion - Значение

Latest - 8.0

LatestMajor - 8.0

Preview - Еще не определен

Проекты, в которых не указана LangVersion, будут обрабатываться так, как если бы они были Latest, а C# 8.0 была бы GA.

Если Вы создали проект для C# 8.0 предварительного просмотра с таргетингом на предварительный просмотр .NET Core 3.0 или .NET Standard 2.1, а также не указали LangVersion, это будет так, как если бы Latest уже выбрано. Вы не получите доступ к Preview ни в каком сценарии, если C# 8.0 и .NET Core 3.0 будут GA.

Во время написания кода нету предварительного просмотра C#, когда C# 8.0 - GA. В дальнейшем, предварительный просмотр будет доступен, Вы сможете прочитать об этом в будущих блог постах.

Основная причина

До этого момента дефолтная C# версия, используемая в Visual Studio, была эквивалентна LatestMajor. Это было проблематично по двум причинам:

 

  1. C# теперь развертывается между циклами Visual Studio, но новые проекты в Visual Studio по-прежнему будут использовать более старую C# версию по умолчанию.
  2. Предварительный просмотр C# 8.0 является лучшим выбором для проектов, нацеленных на предварительный просмотр .NET Core 3.0, но раньше не было никакой возможности сделать его по умолчанию без того, чтобы сделать его по умолчанию для проектов, которые не нацелены на предварительный просмотр .NET Core 3.0.

 

В целом, C# продолжает развертываться и выпускать еще больше функций, которые нацелены на будущую версию .NET Core, где Вы сможете использовать эти функции как можно удобнее. Это также позволит использовать эти функции на ранних этапах их жизненного цикла, увеличивая интервал времени, в течение которого Ваши отзывы и пожелания могут влиять на их разработку.

Поддержка и совместимость функций предварительного просмотра

Использовать функции предварительного просмотра C# 8.0 в выпущенной Visual Studio 2019 версии не так просто, поскольку существуют проблемы поддержки и совместимости функций предварительного просмотра и уже выпущенных функций:

 

  • Любая функция или поведение версии C# 7.3 и ниже полностью поддерживается и полностью совместима.
  • Любая функция предварительного просмотра C# 8.0 не поддерживается.
  • Нет гарантии совместимости от одного предварительного просмотра C# 8.0 к другому.

 

В целом, если Вы используете предварительный просмотр C# 8.0 в выпуске Visual Studio 2019, некоторые функции и их работа могут изменяться с настоящего момента до полного официального выпуска C# 8.0.



Exception: Stack empty.