为什么 .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
不等于 false
,null
也不等于 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()) { ... }
我正在尝试进行以下检查:
if (result?.Pets?.Any() == false) { ... }
如果 result == null
.. 则它不在 if
检查的范围内。
我认为 result?.
会(在这种情况下)return null
.. 那么这就是尝试做的事情:
if (null == false) { ... } // result == null
如果是这样..那怎么办?我的第一个想法是这样的:
if (result?.Pets?.Any() == false ?? false) { .. }
但这是编译器错误:(
null
不等于 false
,null
也不等于 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()) { ... }