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

  1. Добавьте <LangVersion>preview</LangVersion> (или 8.0) в секции PropertyGroup Debug и Release:

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