Я играл с 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.
Я предполагаю, чтопредупреждение возникает из-за того, что локальные функции на самом деле реализуются путем поднятия их к анонимному классу, и внутри этого класса, рассматриваемого вне контекста, это действительно возможная нулевая ссылка.
Это просто случай, когда компилятореще не понял или есть что-то более коварное, что говорит, что это предупреждение должно остаться?