#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:
Похоже, что в настоящее время это известное ложное срабатывание. Также похоже, что это на их радаре, но в течение некоторого времени не было никаких изменений.
Я бы лично, вероятно, просто подавил это предупреждение в данном конкретном случае.