Как включить функцию Nullable Reference Types в C# 8.0 для всего проекта
Согласно анонсу новой функции C# 8.0, названной "ссылочные типы, допускающие обнуляемость", она может быть включена для всего проекта. (упомянуто здесь: https://youtu.be/VdC0aoa7ung?t=137) Но как включить его для проекта? Не удалось найти какой-либо новой подходящей опции в окне "Свойства проекта" в Visual Studio 2019 Preview 1. Может ли она быть включена для "старых" проектов.NET Framework, если версия языка C# для них была изменена на 8.0?
2 ответа
Обратите внимание, что этот параметр изменился между VS 2019 Предварительный просмотр 1 и Предварительный просмотр 2. С предварительным просмотром 2 или 3 это необходимо .csproj
:
<PropertyGroup>
<LangVersion>8.0</LangVersion>
<NullableContextOptions>enable</NullableContextOptions>
</PropertyGroup>
Итак <NullableReferenceTypes>
упомянутый в предыдущем ответе (который, когда я первоначально писал этот ответ 4 февраля 2019 г., был помечен как принятый ответ), был верным на момент написания ответа, но он больше не распознается.
В Visual Studio 16.1 имя свойства изменилось на Nullable
что проще и совпадает с аргументом командной строки.
<PropertyGroup>
...
<Nullable>enable</Nullable>
<LangVersion>8.0</LangVersion>
</PropertyGroup>
Обратите внимание, что в дополнение к принятому ответу @DrewNoakes свойство, допускающее значение NULL, может быть установлено для всех проектов сразу, добавив файл с именемDirectory.Build.props
в папке, содержащей ваш .sln
файл.
Просто определите свой Directory.Build.props
файл вроде этого:
<Project>
<PropertyGroup>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>
Вам нужно будет перезапустить Visual Studio, чтобы это вступило в силу.
Больше о Directory.Build.props
Стоит отметить, что на данный момент это также доступный параметр на странице свойств проекта:
По крайней мере, в VS2019 16.6+.
Чтобы включить функцию ссылочных типов Nullable для проекта.NET Core, добавьте NullableReferenceTypes
собственность на .csproj
файл как это:
<PropertyGroup>
...
<NullableReferenceTypes>true</NullableReferenceTypes>
<LangVersion>8.0</LangVersion>
</PropertyGroup>
UPD:
Как упоминалось в комментариях @JulienCouvreur относительно https://github.com/dotnet/project-system/issues/4058 новое свойство еще не поддерживается в "старой" системе проекта. Но будет поддерживаться до выхода C# 8.0.
Устаревший формат csproj
Вы спросили о наследии .csproj
формат. Откройте файл проекта в текстовом редакторе и внесите следующие изменения:
Добавить / изменить
<LangVersion>8.0</LangVersion>
вDebug
а такжеRelease
Разделы PropertyGroup:<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> <LangVersion>preview</LangVersion>
Включите поддержку ссылочных типов, допускающих значение NULL, добавив
<Nullable>enable</Nullable>
На главнуюPropertyGroup
:<PropertyGroup> <Nullable>enable</Nullable>
Протестировано с приложением.NET WinForms с использованием синтаксиса C# 8 и ссылочных типов, допускающих значение NULL, в Visual Studio 2019 v16.2.0 Preview 3.
Файлы проекта в стиле SDK
Проекты в стиле SDK намного проще, и их можно редактировать в Visual Studio. Для этого все, что вам нужно, это (в том жеPropertyGroup
как TargetFramework
или TargetFrameworks
):
<PropertyGroup>
<LangVersion>8.0</LangVersion>
<Nullable>enable</Nullable>
</PropertyGroup>
Заметки
По умолчанию проекты.NET Core 3.x нацелены на C# 8, поэтому указывать
LangVersion
для этих проектов.По умолчанию для проектов.NET Framework используется C# 7.3, и вы не получите C# 8.0 даже с
<LangVersion>latest</LangVersion>
. Вы должны явно указать версию языка 8.0. См. Мой ответ на вопрос Поддерживает ли C# 8.NET Framework? Больше подробностей.