Как включить функцию 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формат. Откройте файл проекта в текстовом редакторе и внесите следующие изменения:

  1. Добавить / изменить <LangVersion>8.0</LangVersion> в Debug а также Release Разделы PropertyGroup:

    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
       <LangVersion>preview</LangVersion>
    
  2. Включите поддержку ссылочных типов, допускающих значение 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? Больше подробностей.

Другие вопросы по тегам