C#Null合并运算符与Null和Empty集合之间的OR运算符的行为不同

詹姆斯·劳

我观察到null合并运算符与OR运算符结合使用时会出现一些奇怪的现象,并且想知道是否有人可以对此有所了解。

var nullCollection = null as IEnumerable<string>;
var emptyCollection = Enumerable.Empty<string>();

Console.WriteLine(nullCollection?.Any() ?? false || true);
Console.WriteLine(emptyCollection?.Any() ?? false || true);

产生以下输出:

True
False

简单地评估nullCollection?.Any() ?? falseemptyCollection?.Any() ?? false两者兼而有之False,这将是预期的行为,但是将条件与||运算符组合在一起似乎会导致不评估第二个条件,仅在集合为空的情况下。

在空合并条件上添加一些附加括号似乎可以解决此问题:

Console.WriteLine((nullCollection?.Any() ?? false) || true);
Console.WriteLine((emptyCollection?.Any() ?? false) || true);

屈服:

True
True

为什么是这样?这里发生了什么?我想念什么?

帕维尔·阿尼克豪斯基(Pavel Anikhouski)

根据运算符的优先级,条件OR运算符的||优先级高于null-coalescing运算符??

根据null推销操作员规范:

??如果左侧操作数的计算结果为非null ,则运算符不会评估其右侧操作数。

因此,在您的代码中需要添加括号以使执行和??操作员评估的顺序正确

如果不带括号,则nullCollection?.Any()返回null,因此??运算符将返回的结果false || true(由于上述优先级),始终为true

emptyCollection?.Any()结果不是null并且返回false,因此右边false || true没有被评估,编译器足够聪明来理解它。

添加括号会强制编译器执行运算符的预期执行:

  • (nullCollection?.Any() ?? false)返回,false因为左侧操作数为,null而右侧操作数已执行。
  • (emptyCollection?.Any() ?? false)还返回false,左侧操作数null不执行,右侧不执行。

两种情况下的逻辑“或”false || true返回true,您将看到期望的行为

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Java中的c#null合并运算符是否有相等的值?

来自分类Dev

CString运算符“ + =”和“ +”之间的不同行为

来自分类Dev

布尔表达式中的C#null或null条件运算符

来自分类Dev

C#中的sql null和null合并运算符

来自分类Dev

对于负整数,为什么C和Ruby之间的模运算符(%)的行为不同?

来自分类Dev

对于负整数,为什么C和Ruby之间的模运算符(%)的行为不同?

来自分类Dev

空合并分配运算符的行为

来自分类Dev

??的用法 运算符(null-coalescing运算符)

来自分类Dev

??的用法 运算符(null-coalescing运算符)

来自分类Dev

C ++运算符“ <”和“>”

来自分类常见问题

接口和类的'instanceof'运算符的行为不同

来自分类Dev

合并不同的运算符

来自分类Dev

+ =运算符和新的运算符c#

来自分类Dev

想要结合使用PHP Null合并运算符(??)

来自分类Dev

Python:和/或运算符奇怪的行为

来自分类Dev

C运算符的优势:增量运算符和逻辑运算符

来自分类Dev

C#+运算符的奇怪行为

来自分类Dev

C ++指针,++运算符行为

来自分类Dev

C ++运算符[]

来自分类Dev

C ++运算符“?:”

来自分类Dev

运算符和方法之间的区别

来自分类Dev

AddAssign和'+ ='运算符之间的关系

来自分类Dev

<>和!=比较运算符之间的区别?

来自分类Dev

if语句和“?/:”运算符之间的区别

来自分类Dev

JavaScript null和加号(+)运算符

来自分类Dev

Dart Null安全/断言运算符

来自分类Dev

Dart Null安全/断言运算符

来自分类Dev

SQL - 运算符 LIKE 返回 '%' 或 null

来自分类Dev

省略PHP三元和null合并运算符中的“ else”