Аннотация для ссылочных типов, допускающих значение NULL, должна использоваться только в коде в содержимом «#nullable». - PullRequest
9 голосов
/ 03 апреля 2019

Только что загрузил VS2019 и создал консольное приложение, чтобы опробовать новые C # 8 нулевые ссылочные типы.Переключил проект на сборку с языком C # 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' content
        }
    }

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

1 Ответ

14 голосов
/ 03 апреля 2019

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

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

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.Вы можете думать о компиляторе до C # 8 как о компиляции всего вашего кода в disabled обнуляемом контексте: любой ссылочный тип может быть нулевым. контекст предупреждений обнуляемых предупреждений может быть установлен на enabled, disabled или safeonly.Контекст обнуляемых предупреждений определяет предупреждения, сгенерированные компилятором с использованием его анализа потока.

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

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

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

#nullable enable: Устанавливает контекст аннулирования аннулирования и контекст предупреждения обнуляемого значения enabled .

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

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

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

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

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

#pragma warning restore nullable: восстановить в контекст предупреждения 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: возможное возвращение нулевой ссылки.

...