Как включить функцию Nullable Reference Types для С# 8.0 для всего проекта
Согласно анонсу С# 8, функция "ссылочные типы, допускающие обнуление" может быть включена для всего проекта.
Но как включить его для проекта? Я не нашел никакой новой соответствующей опции в окне "Свойства проекта" в Visual Studio 2019 Preview 1. Может ли она быть включена для "устаревших" проектов .csproj
, если языковая версия С# изменена на 8.0?
Ответы
Ответ 1
В Visual Studio 16.2 (из предварительного просмотра 1) имя свойства изменилось на Nullable
что проще и соответствует аргументу командной строки.
<PropertyGroup>
...
<Nullable>enable</Nullable>
<LangVersion>8.0</LangVersion>
</PropertyGroup>
Для более старых версий Visual Studio:
- От 16.0 предварительного просмотра 2 до 16.1 установите
NullableContextOptions
для enable
- В предварительном просмотре 16.0 1 установите для
NullableReferenceTypes
значение true
Ответ 2
Обратите внимание, что этот параметр изменился между предварительным просмотром 1 VS 2019 и предварительным просмотром 2. В предварительном просмотре 2 или 3 это необходимо в вашем .csproj
:
<PropertyGroup>
<LangVersion>8.0</LangVersion>
<NullableContextOptions>enable</NullableContextOptions>
</PropertyGroup>
Таким образом, <NullableReferenceTypes>
упомянутый в предыдущем ответе (который, когда я изначально писал этот ответ 4 февраля 2019 г., был помечен как принятый ответ), был верным в момент написания ответа, но больше не распознается.
Ответ 3
Для Visual Studio 2019 Preview 2 & 3 см. Ответ Иана Гриффитса
Решение для Visual Studio 2019 Preview 1:
Чтобы включить функцию ссылочных типов Nullable для проекта .NET Core, добавьте свойство NullableReferenceTypes
в файл .csproj
следующим образом:
<PropertyGroup>
...
<NullableReferenceTypes>true</NullableReferenceTypes>
<LangVersion>8.0</LangVersion>
</PropertyGroup>
Как упоминалось в комментариях @JulienCouvreur относительно https://github.com/dotnet/project-system/issues/4058, новое свойство еще не поддерживается в "старой" системе проекта. Но будет поддерживаться до выхода С# 8.0.
Ответ 4
Вы спрашивали о устаревшем формате .csproj
. Мне удалось скомпилировать приложение .NET WinForms с С# 8 в Visual Studio 2019 (v16.2.0 Preview 3), вручную внеся следующие изменения:
Добавьте <LangVersion>preview</LangVersion>
(или 8.0
) в секции PropertyGroup Debug
и Release
:
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<LangVersion>preview</LangVersion>
Включите поддержку необнуляемых ссылочных типов, добавив <Nullable>enable</Nullable>
к основному PropertyGroup
:
<PropertyGroup>
<Nullable>enable</Nullable>
В этой конфигурации типы ссылок, допускающие обнуление, компилируются без предупреждения или ошибки.
Если я удаляю <Nullable>enable</Nullable>
, проект компилируется, но с предупреждением компилятора "CS8632: аннотация для обнуляемых ссылочных типов должна использоваться только в коде в контексте" #nullable "".
Проекты в стиле SDK намного проще и могут редактироваться в Visual Studio. Для этого все, что вам нужно (в том же PropertyGroup
, что и TargetFramework
или TargetFrameworks
):
<PropertyGroup>
<LangVersion>8.0</LangVersion>
<Nullable>enable</Nullable>
</PropertyGroup>
Примечание: С# 8 и .NET Core 3.0 уже опубликованы и поддерживаются Visual Studio 2019 версий 16.3 и выше. Проекты .NET Core 3.x по умолчанию предназначены для С# 8 by default, поэтому вам не нужно указывать LangVersion
для этих проектов.
По умолчанию для проектов .NET Framework используется С# 7.3, и из моих экспериментов видно, что вы не получаете С# 8.0 даже с <LangVersion>latest</LangVersion>
. <LangVersion>8.0</LangVersion>
нужно будет указать - и из того, что я могу найти, он официально не поддерживается (см. мой ответ на вопрос Поддерживает ли С# 8.NET Framework? для моих выводов подробно) ,