В настройках расширенной сборки Visual Studio 2019 С# 8, по-видимому, недоступен для проекта .NET Framework, только (как на рисунке ниже) для проекта .NET Core 3.0:
Поддерживает ли С# 8.NET Framework?
В настройках расширенной сборки Visual Studio 2019 С# 8, по-видимому, недоступен для проекта .NET Framework, только (как на рисунке ниже) для проекта .NET Core 3.0:
Поддерживает ли С# 8.NET Framework?
Согласно этой записи в блоге язык действительно привязан к фреймворку:
Это означает, что типы, необходимые для использования этих функций, не будут доступны в .NET Framework 4.8. Аналогично, реализации элементов интерфейса по умолчанию полагаются на новые усовершенствования среды выполнения, и мы не будем делать их в .NET Runtime 4.8.
По этой причине использование С# 8.0 поддерживается только на платформах, которые реализуют .NET Standard 2.1. Необходимость сохранения стабильности среды выполнения мешала нам внедрять новые языковые функции в течение более десяти лет. Учитывая параллельную и открытую природу современных сред выполнения, мы чувствуем, что мы можем ответственно развивать их снова и делать дизайн языка с учетом этого. Скотт объяснил в своем обновлении .NET Core 3.0 и .NET Framework 4.8, что в будущем в .NET Framework будет меньше инноваций, вместо этого он сосредоточится на стабильности и надежности. Учитывая это, мы считаем, что для него лучше упустить некоторые языковые функции, чем никто не получит их.
Да, С# 8 может использоваться с .NET Framework и другими целями, более ранними, чем .NET Core 3.0/.NET Standard 2.1 в Visual Studio 2019 (или более старыми версиями Visual Studio, если вы устанавливаете пакет Nuget).
Языковая версия должна быть установлена на 8.0
в файле csproj.
Большинство - но не все - функции доступны в зависимости от целевого фреймворка.
Следующие функции являются только изменениями синтаксиса; они работают независимо от структуры:
Это требует новых типов, которых нет в .NET Framework. Их можно использовать только в сочетании с пакетами Nuget "polyfill" или файлами кода:
Элементы интерфейса по умолчанию не будут компилироваться в .NET и никогда не будут работать, потому что они требуют изменений во время выполнения в CLR..NET CLR теперь заморожена, так как .NET Core - это путь вперед.
Дополнительную информацию о том, что работает, а что нет, а также о возможных полифиллах см. в статье Стюарта Ланга, С# 8.0 и .NET Standard 2.0 - "Вещи без поддержки".
Следующий проект С#, нацеленный на .NET 4.8 и использующий ссылочные типы С# 8, компилируется в Visual Studio 16.2.0. Я создал его, выбрав шаблон .NET Standard Class Library и затем отредактировав его для целевой .NET:
.csproj:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net48</TargetFrameworks>
<LangVersion>8.0</LangVersion>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>
.cs:
namespace ClassLibrary1
{
public class Class1
{
public string? NullableString { get; set; }
}
}
Затем я попробовал WinNET-проект .NET 4.5.2, используя устаревший формат .csproj
, и добавил то же свойство ссылочного типа, допускающее обнуляемость. Я изменил тип языка в диалоговом окне настроек Visual Studio Advanced Build (отключено в 16.3) на latest
и сохранил проект. Конечно как этот пункт он не строит. Я открыл файл проекта в текстовом редакторе и изменил latest
на preview
в конфигурации сборки PropertyGroup
:
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<LangVersion>preview</LangVersion>
Затем я включил поддержку необнуляемых ссылочных типов, добавив <Nullable>enable</Nullable>
к основному PropertyGroup
:
<PropertyGroup>
<Nullable>enable</Nullable>
Я перезагрузил проект, и он собирает.
Когда этот ответ был впервые написан, С# 8 был в предварительном просмотре, и много детективной работы было вовлечено. Я оставляю эту информацию здесь для потомков. Не стесняйтесь пропустить это, если вам не нужно знать все кровавые подробности.
Язык С# исторически был в основном независимым от фреймворка - т.е. мог компилировать более старые версии Framework - хотя некоторые функции требовали новых типов или поддержки CLR.
Большинство энтузиастов С# прочитали запись блога Building С# 8.0 Мэдса Торгерсена, в которой объясняется, что некоторые функции С# 8 имеют зависимости от платформы:
Все асинхронные потоки, индексаторы и диапазоны зависят от новых типов инфраструктуры. это будет частью .NET Standard 2.1....NET Core 3.0, а также Xamarin, Unity и Mono будут реализовывать .NET Standard 2.1, но .NET Framework 4.8 не будет. Это означает, что типы, необходимые для использования эти функции не будут доступны в .NET Framework 4.8.
Это похоже на Value Tuples, которые были представлены в С# 7. Для этой функции требовались новые типы - структуры ValueTuple
- которые не были доступны в версиях NET Framework ниже 4.7 или .NET Standard более ранних, чем 2.0. Однако С# 7 все еще можно использовать в более старых версиях .NET, либо без кортежей значений, либо с ними, установив пакет Nuget System.ValueTuple. Visual Studio это поняла, и с миром все было в порядке.
Однако Мэдс также написал:
По этой причине использование С# 8.0 поддерживается только на платформах, которые реализуют .NET Standard 2.1.
... который в случае истинности исключил бы использование С# 8 с любой версией .NET Framework и даже в библиотеках .NET Standard 2.0, которые только недавно нам предложили использовать в качестве базовой цели для кода библиотеки. Вы даже не сможете использовать его с версиями .NET Core старше 3.0, поскольку они также поддерживают только .NET Standard 2.0.
Расследование было начато! -
У Джона Скита есть альфа-версия Noda-Time, использующая С# 8 , готовая к работе, предназначенная только для .NET Standard 2.0. Он явно ожидает, что С# 8/.NET Standard 2.0 будет поддерживать все платформы семейства .NET. (См. также сообщение в блоге Джона "Первые шаги со ссылочными типами, допускающими обнуляемость").
Сотрудники Microsoft обсуждают пользовательский интерфейс Visual Studio для обнуляемых ссылочных типов С# 8 на GitHub, и заявлено, что они намерены поддерживать устаревший csproj
(pre-.NET Core SDK формат csproj
). Это очень убедительный признак того, что С# 8 будет использоваться с .NET Framework. [Я подозреваю, что они вернутся к этому теперь, когда раскрывающийся список языковых версий Visual Studio 2019 отключен, а .NET привязан к С# 7.3]
Вскоре после известной записи в блоге в теме GitHub обсуждалась межплатформенная поддержка. Важным моментом, который возник, было то, что .NET Standard 2.1 будет содержать маркер, который обозначает, что поддерживаются реализации интерфейсов по умолчанию - функция требует изменения CLR, которое никогда не будет доступно .NET Framework. Важный момент от Иммо Ландверта, менеджера программ в команде .NET в Microsoft:
Ожидается, что компиляторы (такие как С#) будут использовать наличие этого поля, чтобы решить, разрешать или нет реализации интерфейса по умолчанию. Если поле присутствует, ожидается, что среда выполнения сможет загружать & выполнить полученный код.
Все это указывало на то, что "С# 8.0 поддерживается только на платформах, которые реализуют .NET Standard 2.1", что является слишком упрощением, и что С# 8 будет поддерживать .NET Framework, но, поскольку существует так много неопределенности, я спросил на GitHub и HaloFour ответили:
IIRC, единственная функция, которая определенно не появится в .NET Framework, - это DIM (методы интерфейса по умолчанию), так как для этого требуются изменения во время выполнения. Другие функции определяются формой классов, которые никогда не могут быть добавлены в .NET Framework, но могут быть заполнены с помощью собственного кода или NuGet (диапазоны, индексы, асинхронные итераторы, асинхронное удаление).
Виктор Деркс отметил, что " новые атрибуты, допускающие обнуляемость, необходимые для разработки более сложных случаев использования, допускающие обнуляемость, доступны только в System.Runtime.dll, поставляемой с .NET Core 3.0 и .NET Standard 2.1... [и] несовместимо с .NET Framework 4.8"
Тем не менее, Immo Landwerth прокомментировал, что "подавляющему большинству наших API не нужны никакие пользовательские атрибуты, так как типы являются либо полностью универсальными, либо ненулевыми" в статье Попробуйте ссылочные типы Nullable
Бен Холл (Ben Hall) поднял проблему Доступность атрибутов, допускающих обнуляемость вне Core 3.0, на GitHub. Следует отметить следующие комментарии сотрудников Microsoft:
С# 8 будет полностью поддерживаться только на .net core 3.0 и .net standard 2.1. Если вы вручную отредактируете файл проекта для использования С# 8 с .net core 2.1, Вы находитесь на неподдерживаемой территории. Некоторые функции С# 8 будут хорошо работают, некоторые функции С# 8 будут работать не слишком хорошо (например, плохо производительность), некоторые функции С# 8 будут работать с дополнительными хаки, а некоторые Функции С# 8 не будут работать вообще. Очень сложно объяснить. Мы - нет активно блокировать его, чтобы опытные пользователи, которые могут перемещаться по нему, могут Сделай так. Я бы не рекомендовал использовать этот неподдерживаемый микс и матч широко.
(Ян Котас)
Такие люди, как вы, которые хотят понять - и работать вокруг них - можно использовать С# 8. Дело в том, что не все функции языка будут работать на нижних уровнях.
(Иммо Ландверт)
В RTM-версии Visual Studio 2019 версии 16.3 произошли серьезные изменения - версия для запуска С# 8.0: раскрывающийся список выбора языка отключен:
rationale от Microsoft по этому поводу:
Двигаясь вперед,... каждая версия каждого фреймворка будет иметь один поддерживается и версия по умолчанию, и мы не будем поддерживать произвольные версии. Чтобы отразить это изменение в поддержке, эта фиксация навсегда отключает поле со списком языковой версии и добавляет ссылку на документ объясняя изменения.
Документ, который открывается, является версионным языком С#. Это перечисляет С# 8.0 в качестве языка по умолчанию ТОЛЬКО для .NET Core 3.x. Это также подтверждает, что каждая версия каждой платформы будет, в будущем, иметь единственную поддерживаемую версию по умолчанию и что на инфраструктурный независимость языка больше нельзя полагаться.
Для языковой версии все еще можно установить значение 8 для проектов .NET Framework, отредактировав файл .csproj.
Комбинация С# 8/.NET Framework официально не поддерживается Microsoft. Это, говорят, только для экспертов.
это не долгий ответ, по словам Скотта Хантера из .net пород, С# 8 не поддерживается в .net framework 4.8...
так нет!