我今天遇到了一个奇怪的场景,我想知道有没有人能解释为什么我会看到下面所看到的.

我希望以下所有语句的计算结果都为True,但当可为空的bool设置为False时,它的计算结果为False.

我读过其他文章,指出您应该优先使用使用空值排序规则的运算符.这当然是可行的,但这不能解释为什么第二个表达式的计算结果为False,这是我想要回答的问题.

我甚至创造了Sharplab.io个这样的东西.在我看来,前两个表达式中的True个部分刚刚被删除.这对我来说没有任何意义,似乎是一个错误.当然,您可以使用括号来绕过它,但这种行为在我看来真的很奇怪.

bool? nullableBoolEqualNull = null;
bool? nullableBoolEqualFalse = false;

Console.WriteLine(nullableBoolEqualNull ?? false || true); // Evaluates to `True`
Console.WriteLine(nullableBoolEqualFalse ?? false || true); // Evaluates to `False`
Console.WriteLine((nullableBoolEqualNull ?? false) || true); // Evaluates to `True`
Console.WriteLine((nullableBoolEqualFalse ?? false) || true); // Evaluates to `True`

事先感谢您对这个问题的任何见解.

推荐答案

请看这里的表格:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/#operator-precedence

空合并运算符??的运算符优先级低于条件或运算符||.

这意味着您的代码将被判断为:

Console.WriteLine(nullableBoolEqualFalse ?? (false || true));

false || true的计算结果为true,nullableBoolEqualFalse ?? true的计算结果为nullableBoolEqualFalse,这就是您在输出中看到false的原因.

Csharp相关问答推荐

如何在Visual Studio代码中更改大括号模式{},用于C#语言

为什么总输出就像12.3没有一分一样?

使用C#中的SDK在Microsoft Graph API上使用SubscribedSkus的问题

如何在Parall.ForEachAsync中使用CancerationTokenSource

查找表中的模式

TeamsBot SendActivityActivityTypes与ActivityTypes同步.键入不再起作用

在C#中,将两个哈希集连接在一起的时间复杂度是多少?

如何通过寻找向量长度来优化两个循环?

ASP.NET Core MVC将值从视图传递到控制器时出现问题

交替的奇数

MSTest--将消息直接写入StdOut和使用TestContext有什么不同?

是否可以将Collectionview中的数组与ObservableCollection绑定?

在C#中有没有办法减少大型数组中新字符串的分配?

如何使用.NET Aspire从Blazor应用程序与GRPC API通信?

无法将.Net Framework 4.8.1升级到.Net 7

是否在异步方法中避免Span<;T>;.ToArray()?

使用ImmutableList时,DynamicData未按预期工作

从API调用调用Worker服务方法

泛型类型BoundedComponent struct

调试时无法重现DbUpdateConcurrentException