Аннотация для ссылочных типов, допускающих обнуляемость, должна использоваться только в коде в контексте "#nullable"

Просто скачал VS2019 и создал консольное приложение, чтобы опробовать новые С# 8 нулевые ссылочные типы. Перешли на сборку проекта с языком С# 8 (в настоящее время отображается как бета)

Затем следующий код выдает предупреждение.

 class Program
    {
        static void Main(string[] args)
        {
            string? message = "Hello World";
            string message2 = null;

            Console.WriteLine(message);
            Console.WriteLine(message2);

            // The annotation for nullable reference types should only be used in code within a '#nullable' context
        }
    }

Что это на самом деле означает?

Ответ 1

Для тех, кто в конечном итоге здесь. Вы можете поместить #nullable enable поверх файла для файлового подхода, как предложено @Marc в комментариях.

Вы также можете использовать комбинации #nullable включения/выключения, чтобы комментировать только части файла

class Program
{
    static void Main(string[] args)
    {
#nullable enable
        string? message = "Hello World";
#nullable disable
        string message2 = null;

        Console.WriteLine(message);
        Console.WriteLine(message2);
    }
}

Здесь ссылка на документы. https://docs.microsoft.com/en-us/dotnet/csharp/nullable-references#nullable-contexts

Обнуляемые контексты позволяют детально контролировать как компилятор интерпретирует переменные ссылочного типа. обнуляемый контекст аннотации любой заданной строки источника - enabled или disabled. Вы можете думать о компиляторе до С# 8 как о компиляции всего вашего кода в disabled обнуляемый контекст: любой ссылочный тип может быть нулевым. контекст предупреждений обнуляемости может быть установлен на enabled, disabled или safeonly. Обнуляемый контекст предупреждений определяет предупреждения генерируется компилятором с использованием анализа потока.

Обнуляемый контекст аннотации и обнуляемый контекст предупреждения могут быть установить для проекта с использованием элемента Nullable в вашем Файл csproj. Этот элемент определяет, как компилятор интерпретирует Обнуляемость типов и какие предупреждения генерируются. Допустимые настройки являются:

  • enable: контекст аннулируемой аннотации включен. Обнуляемый контекст предупреждения включен. Переменные ссылочного типа, например, string, не могут обнуляться. Все предупреждения об обнуляемости включены.
  • disable: контекст аннулируемой аннотации отключен. Контекст предупреждения обнуляемый отключен. Переменные ссылочного типа не обращают внимания, как и более ранние версии С#. Все предупреждения об обнуляемости отключены.
  • safeonly: контекст аннулируемой аннотации включен. Контекст предупреждения обнуляемый безопасен. Переменные ссылочного типа не обнуляются. Все предупреждения о нарушении безопасности включены.
  • warnings: контекст аннулируемой аннотации отключен. Контекст предупреждения обнуляемый включен. Переменные ссылочного типа не обращают внимания. Все предупреждения об обнуляемости включены.
  • safeonlywarnings: контекст аннулируемой аннотации отключен. Контекст предупреждения обнуляемый безопасен. Переменные ссылочного типа не обращают внимания. Все предупреждения о нарушении безопасности включены.

Вы также можете использовать директивы для установки этих же контекстов в любом месте вашего проекта:

#nullable enable: Устанавливает контекст аннулируемой аннотации и контекст предупреждающего обнуления на включенный.

#nullable disable: устанавливает для контекста обнуляемой аннотации и контекста обнуляемого предупреждения значение отключено.

#nullable safeonly: установите для включаемого контекста аннотации значение NULL, а для контекста предупреждения - safeonly.

#nullable restore: Восстанавливает контекст аннулируемой аннотации и контекст предупреждающего обнуления в настройках проекта.

#pragma warning disable nullable: установите для недопустимого контекста предупреждения значение отключено.

#pragma warning enable nullable: установите для предупреждающего контекста значение enabled.

#pragma warning restore nullable: восстанавливает обнуляемый контекст предупреждения в настройках проекта.

#pragma warning safeonly nullable: Устанавливает контекст предупреждения обнуляемости на safeonly.

Обнуляемая по умолчанию аннотация и контексты предупреждения disabled. Это решение означает, что ваш существующий код компилируется без изменения и без создания новых предупреждений.

Различия между контекстами предупреждений enabled и safeonly являются предупреждениями для назначения обнуляемой ссылки для необнуляемой ссылки.

или, чтобы включить этот проект, необходимо добавить

 <Nullable>enable</Nullable>

в файл вашего проекта.

Должно выглядеть так:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.2</TargetFramework>
    <LangVersion>8.0</LangVersion>
    <Nullable>enable</Nullable>
  </PropertyGroup>

</Project>

и преобразовать эти предупреждения в ошибки - добавьте

<WarningsAsErrors>CS8600;CS8602;CS8603</WarningsAsErrors>

в файл вашего проекта

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.2</TargetFramework>
    <LangVersion>8.0</LangVersion>
    <Nullable>enable</Nullable>
    <WarningsAsErrors>CS8600;CS8602;CS8603</WarningsAsErrors>
  </PropertyGroup>

</Project>

CS8600: преобразование пустого литерала или возможного нулевого значения в ненулевой тип.

CS8602: возможное разыменование нулевой ссылки.

CS8603: возможен возврат нулевой ссылки.