После выхода 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>
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.1</TargetFramework>
<LangVersion>8.0</LangVersion>
</PropertyGroup>
</Project>
<?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>(…).
Поддерживаемые возможности
Возможности, для которых требуются дополнительные библиотеки
Для поддержки данных возможностей требуются типы IAsyncEnumerable<T>, IAsyncEnumerator<T> и IAsyncDisposable, которые входят в .NET Standard 2.1. Поэтому в проекты для .NET и .NET Core 2.x необходимо добавить библиотеку Microsoft.Bcl.AsyncInterfaces.
Данная возможность использует тип 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, как содержащий ошибки. Но это не будет мешать успешной сборке проекта.