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 шт):
Вам нужно проверить, что 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.
