Поддерживает ли С# 8.NET Framework? - программирование
Подтвердить что ты не робот

Поддерживает ли С# 8.NET Framework?

В настройках расширенной сборки Visual Studio 2019 С# 8, по-видимому, недоступен для проекта .NET Framework, только (как на рисунке ниже) для проекта .NET Core 3.0:

enter image description here

Поддерживает ли С# 8.NET Framework?

4b9b3361

Ответ 1

Согласно этой записи в блоге язык действительно привязан к фреймворку:

Это означает, что типы, необходимые для использования этих функций, не будут доступны в .NET Framework 4.8. Аналогично, реализации элементов интерфейса по умолчанию полагаются на новые усовершенствования среды выполнения, и мы не будем делать их в .NET Runtime 4.8.

По этой причине использование С# 8.0 поддерживается только на платформах, которые реализуют .NET Standard 2.1. Необходимость сохранения стабильности среды выполнения мешала нам внедрять новые языковые функции в течение более десяти лет. Учитывая параллельную и открытую природу современных сред выполнения, мы чувствуем, что мы можем ответственно развивать их снова и делать дизайн языка с учетом этого. Скотт объяснил в своем обновлении .NET Core 3.0 и .NET Framework 4.8, что в будущем в .NET Framework будет меньше инноваций, вместо этого он сосредоточится на стабильности и надежности. Учитывая это, мы считаем, что для него лучше упустить некоторые языковые функции, чем никто не получит их.

Ответ 2

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

(Иммо Ландверт)


Visual Studio 2019

В RTM-версии Visual Studio 2019 версии 16.3 произошли серьезные изменения - версия для запуска С# 8.0: раскрывающийся список выбора языка отключен:

enter image description here

rationale от Microsoft по этому поводу:

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

Документ, который открывается, является версионным языком С#. Это перечисляет С# 8.0 в качестве языка по умолчанию ТОЛЬКО для .NET Core 3.x. Это также подтверждает, что каждая версия каждой платформы будет, в будущем, иметь единственную поддерживаемую версию по умолчанию и что на инфраструктурный независимость языка больше нельзя полагаться.

Для языковой версии все еще можно установить значение 8 для проектов .NET Framework, отредактировав файл .csproj.


Будьте бдительны

Комбинация С# 8/.NET Framework официально не поддерживается Microsoft. Это, говорят, только для экспертов.

Ответ 3

это не долгий ответ, по словам Скотта Хантера из .net пород, С# 8 не поддерживается в .net framework 4.8...

так нет!