Нуль-условный оператор и! =

С введением Null-Conditional Operators в С# для следующей оценки

if (instance != null && instance.Val != 0)

Если я переписал его таким образом,

if (instance?.Val != 0)  

он будет оцениваться как true, если экземпляр является нулевой ссылкой; Он ведет себя как

if (instance == null || instance.Val != 0)

Итак, каков правильный способ переписать оценку с использованием этого нового синтаксиса?

Edit:

instance - это поле большого объекта, который десериализуется из JSON. Существует довольно много таких фрагментов кода, прежде всего, проверьте, находится ли поле в JSON, если это так, проверьте, не является ли свойство Val НЕ равным константе, только оба условия истинны, выполните некоторую операцию.

Сам код может быть реорганизован, чтобы сделать логический поток более "понятным", как указал Питер в своем комментарии, хотя в этом вопросе меня интересует, как использовать null-conditional operators с !=.

Ответ 1

С возвращаемым значением Null-Conditional всегда может быть null

if ((instance?.Val ?? 0) != 0)

Если экземпляр был пустым, то экземпляр..Val также будет иметь значение null (вероятно, int? в вашем случае). Поэтому вы должны всегда проверять нули перед сравнением с чем-либо:

if ((instance?.Val ?? 0) != 0)

Это означает: Если экземпляр?.Val имеет значение null (потому что экземпляр имеет значение null), то возвращает 0. В противном случае верните экземпляр .Val. Затем сравните это значение с 0 (не равно).

Ответ 2

Вы можете использовать оператор null coallescing:

instance?.Val ?? 0

Когда instance имеет значение null или instance не является нулевым, но Val is, указанное выше выражение будет равно 0. В противном случае возвращается значение Val.

Ответ 3

if ((instance?.Val).GetValueOrDefault() != 0)  

? условный оператор автоматически обрабатывает свойство .Val как Nullable.