为什么 .NET null 条件运算符在尝试检查集合是否包含任何项目时不返回 false?

Why is the .NET null conditional operator not returning false when trying to check if a collection has any items?

我正在尝试进行以下检查:

if (result?.Pets?.Any() == false) { ... }

如果 result == null .. 则它不在 if 检查的范围内。

我认为 result?. 会(在这种情况下)return null .. 那么这就是尝试做的事情:

if (null == false) { ... } // result == null

如果是这样..那怎么办?我的第一个想法是这样的:

if (result?.Pets?.Any() == false ?? false) { .. } 

但这是编译器错误:(

null 不等于 falsenull 也不等于 true。解决这个问题的简单方法是检查 ?.Any() 的结果是否不是 true(即 null false).

if (result?.Pets?.Any() != true) { ... }

正如其他人所解释的,null 不等于 false。使用 null-coalescing 运算符 ?? 来解决这个问题应该可行,但您的语法不正确。正确的语法应该是这样的:

if ((result?.Pets?.Any() ?? false) == false) { ... }

但是,为了可读性,我会选择这样的东西:

bool petsFound = result?.Pets?.Any() ?? false;
if (!petsFound) { ... }

或者,您可以使用空检查和 short-circuiting || 运算符以旧的方式进行操作:

if (result?.Pets is null || !result.Pets.Any()) { ... }