C# nullable warnings в условии, где уже есть проверка на null

if (currentAsm[i].IsClass && currentAsm[i].Namespace != null 
                && currentAsm[i].Namespace.Contains("parse", StringComparison.InvariantCultureIgnoreCase))  

Непонятно, почему среда разработки подсвечивает

currentAsm[i].Namespace

как dereference of a possibly null reference, хотя в этом же условии есть проверка на null

В аналогичном примере с использованием linq, nullable warning отсутствует, когда есть проверка на null

.Where(type => type.FullName != null && type.Namespace != null && type.Namespace.Contains("parse", StringComparison.InvariantCultureIgnoreCase))

И второй вопрос, как лучше оформлять перенос множественного условия в Where? Так как перехода на новую строку сразу с табуляцией нет, самому таб нажимать или делать, как предлагает VS? Например,

введите сюда описание изображения

или так (сам табом форматирую): введите сюда описание изображения


Ответы (1 шт):

Автор решения: pasx

Вам нужно проверить, что currentAsm[i] is not null.

if (currentAsm[i] != null...

Если property Namespace не является nullable string - string? - проверка на null бесполезна и выдаст варнинг.

Но, очевидно, что currentAsm содержит Types и поэтому Namespace property - string?.

Когда вы оцениваете nullable property с методом, который возвращает boolean, результат будет nullable boolean.

Operator '&&' cannot be applied to operands of type 'bool' and 'bool?'

Решение заключается в сравнении результата с non nullable значением: x == true

Таким должен быть и ваш код:

if (currentAsm[i] != null
    && currentAsm[i].IsClass
    && true == currentAsm[i].Namespace?.Contains("parse", StringComparison.InvariantCultureIgnoreCase))
    

Или, лучше - чтение массива только один раз

var t = currentAsm[i];
if (t != null
    && t.IsClass
    && true == t.Namespace?.Contains("parse", StringComparison.InvariantCultureIgnoreCase))

Имена важны. currentAsm должен быть currentType.

Также, задавая вопрос, лучше сказать, что в массиве Type.

→ Ссылка