Обнуляемые ссылочные типы и локальные функции - хорошо ли они играют вместе? - PullRequest
2 голосов
/ 04 апреля 2019

Я играл с VS2019, связывая новые функции C # -8 с существующим телом кода.Я взял небольшой проект и приступил к его преобразованию, чтобы использовать новую функцию ссылочных типов.В процессе, я столкнулся с этим случаем:

using System;

#nullable enable

namespace NullableRefTest
{
  class Demo
  {
    public string? Property { get; set; }

    public int Test()
    {
      if (null == Property) // 1
        throw new InvalidOperationException();

      int f()
      {
        return Property.Length; // 2
      }

      return f(); 
    }
  }
}

Компиляция этого с включенным C # -8 генерирует CS8602 возможное разыменование предупреждения нулевого референса на // 2.

Теперь яподтвердил бы, что здесь явно не существует нулевой ссылки - видимость и время жизни функции f () таковы, что ее нельзя вызвать до теста нулевой ссылки в //1.

Я предполагаю, чтопредупреждение возникает из-за того, что локальные функции на самом деле реализуются путем поднятия их к анонимному классу, и внутри этого класса, рассматриваемого вне контекста, это действительно возможная нулевая ссылка.

Это просто случай, когда компилятореще не понял или есть что-то более коварное, что говорит, что это предупреждение должно остаться?

1 Ответ

2 голосов
/ 04 апреля 2019

Если вы уверены, что переменная не может иметь значение null, вы можете использовать ! ( оператор с нулевым прощением ), чтобы переопределить поведение компилятора.

  int f()
  {
    return Property!.Length; // 2
  }
...