Обнуляемое ядро .Net — запутанные ошибки, касающиеся

#asp.net-core #.net-core #nullreferenceexception #nullable-reference-types

#asp.net-core #.net-core #исключение nullreferenceexception #обнуляемые ссылочные типы

Вопрос:

У меня есть .Net Core 3.1 ASP.NET приложение, в котором я включил nullables:

   <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <Nullable>enable</Nullable>
  

Он также использует Microsoft.CodeAnalysis.FxCopAnalyzers (3.3.0), а также StyleCop.Analyzers .

У меня есть метод со следующей подписью:

  public async Task<SomeResponse> DoSomethingAsync(IIdentity identity)
  

В этом методе у меня есть следующее:

 string? adfsUpn = identity.Name;
  

Но это дает мне предупреждение:

Ошибка CA1062 Во внешне видимом методе […], проверьте, что параметр ‘identity’ не равен нулю, прежде чем использовать его. При необходимости создайте исключение ArgumentNullException, когда аргумент равен нулю, или добавьте предварительное условие контракта кода, утверждающее ненулевой аргумент.

По сути, в нем говорится, что я не должен обращаться к .Name свойству identity объекта, если я сначала не проверил его на значение null.

Однако….

Когда я вызываю этот метод (из контроллера) Я перехожу this.User.Identity , и intellisense показывает мне, что оба this.User и this.User.Identity не являются нулевыми.

Вернемся к моему методу…Я добавляю следующее защитное предложение вверху:

 if (identity == null)
{
    .....
}
  

Но теперь мне говорят, что идентификатор никогда не может быть нулевым, и это identity == null всегда будет false. Это то, на что я надеюсь с использованием «Nullable», но, похоже, Visual Studio, FxCop или StyleCop неправильно интерпретировали ситуацию.

Скорее всего, я просто добавлю оператор pragma, чтобы игнорировать это, но прежде чем я это сделаю, просто хотел проверить, что я ничего не упустил….

Комментарии:

1. Вы можете использовать оператор, прощающий нуль, ! чтобы указать, что identity не может быть нулевым, например identity!.Name

2. Если ошибка выдается анализатором, вы можете проверить его правила на предмет поддержки новейших языковых функций

Ответ №1:

Похоже, что в настоящее время это известное ложное срабатывание. Также похоже, что это на их радаре, но в течение некоторого времени не было никаких изменений.

Я бы лично, вероятно, просто подавил это предупреждение в данном конкретном случае.