Использование C# 8 в .NET 4.7, 4.8 и .NET Core 2.x

C# logoПосле выхода C# 8 все его возможности были доступны только в проектах совместимых с .NET Standard не ниже версии 2.1. Соответственно, разрабатываемое приложение должно быть нацелено на .NET Core 3.0 и выше. Однако теперь новые возможности языка можно использовать и в проектах для .NET 4.7.x, 4.8, а также для предыдущих версий .NET Core. Более того, для сборки, при необходимости, может использоваться Visual Studio 2017.

Указание номера версии языка

После установки 3 обновления Visual Studio 2019 (версия 16.3) в свойствах проекта блокируется выбор версии языка C#. Теперь она определяется автоматически в зависимости от платформы проекта. Поэтому её необходимо указать вручную в файле проекта csproj. Для этого следует добавить следующий тег:

<LangVersion>8.0</LangVersion>
  • .NET Core
<Project Sdk="Microsoft.NET.Sdk">
 
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.1</TargetFramework>
    <LangVersion>8.0</LangVersion>
  </PropertyGroup>
  
</Project>
  • .NET 4.7.x
<?xml version="1.0" encoding="utf-8"?>
  ...
  <PropertyGroup>
    ...
    <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
    <LangVersion>8.0</LangVersion>
    ...
  </PropertyGroup>
  ...
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

Теперь в проекте можно использовать C# 8.  Но, к сожалению, все равно останется ряд ограничений.

Возможности C# 8 в .NET 4.7.x, 4.8 и .NET Core 2.x

Не поддерживаемые возможности

Для реализации по-умолчанию требуется поддержка на уровне платформы.

Для данной возможности языка необходимы типы Index и Range, которых нет в .NET 4.x и .NET Standard до версии 2.1. Нет и отдельного NuGet пакета.

При сильной необходимости их можно вручную перенести из исходников Core CLR на GitHub и адаптировать под текущую платформу: Index, Range и вспомогательный RuntimeHelpers.GetSubArray<T>(…).

Поддерживаемые возможности

  • Сопоставление с образцом в switch.
  • Ссылочные типы, допускающие значение null.
  • using в объявлении переменных.
  • Присваивание при значении null.
  • Неуправляемые шаблонные (generic) типы.
  • Члены структур, не изменяющие их состояния.
  • Освобождение ресурсов (dispose) для ссылочных структур.
  • Улучшенный синтаксис для интерполяции строк.

Возможности, для которых требуются дополнительные библиотеки

Для поддержки данных возможностей требуются типы IAsyncEnumerable<T>, IAsyncEnumerator<T> и IAsyncDisposable, которые входят в .NET Standard 2.1. Поэтому в проекты для .NET и .NET Core 2.x необходимо добавить библиотеку Microsoft.Bcl.AsyncInterfaces.

  • stackalloc во вложенных выражениях.

Данная возможность использует тип Span<T>, который доступен начиная с .NET Standard 2.0 (.NET Core 2.1 и выше). В остальных случаях в проект необходимо установить библиотеку System.Memory для его поддержки.

Компиляция C# 8 в Visual Studio 2017

Попытка собрать проект, использующий C# 8, в Visual Studio 2017 или Team Foundation Server 2017 (если он использует её для компиляции) приведет к ошибке. Причина простая – компилятор из Visual Studio 2017 не знает нового синтаксиса. Это можно исправить, добавив в проект пакет Microsoft.Net.Compilers, который содержит новый компилятор с поддержкой C# 8.

Важно отметить, что это не обновит редактор Visual Studio 2017, который по прежнему будет показывать новые ключевые слова и код, использующий возможности C# 8, как содержащий ошибки. Но это не будет мешать успешной сборке проекта.

Добавить комментарий