C# 微软更喜欢虚假价值?

C# 微软更喜欢虚假价值?,c#,.net-4.0,nullable,boolean-logic,C#,.net 4.0,Nullable,Boolean Logic,我在读乔恩·斯基特的书。(#4) 但有一件事(除其他外)引起了我的注意: 主题:布尔 他在一张表格中写道:(X,Y是布尔?) 好吧,好吧。。。所以空值是决定的那个。 这里的布尔操作数丢失 X | Y | X & Y --------------------------- false null false 为什么? 为什么这里要考虑bool操作数,而在上一个示例中,决定结果的是null 似乎真与假在不同的地方有朋友……:)根据微软的说法,

我在读乔恩·斯基特的书。(#4)

但有一件事(除其他外)引起了我的注意:

主题:布尔

他在一张表格中写道:(X,Y是布尔?)

好吧,好吧。。。所以空值是决定的那个。 这里的布尔操作数丢失

X      |    Y     |   X & Y
---------------------------
false      null       false
为什么? 为什么这里要考虑bool操作数,而在上一个示例中,决定结果的是null


似乎真与假在不同的地方有朋友……:)

根据微软的说法,它是

确保&和|运算符生成的结果与SQL中的三值布尔类型一致


.

之所以这样设计,是为了与许多其他平台(包括SQL)中实现的一致。在Kleene逻辑(三值逻辑的基础)中,
真和未知
给出
未知
,而
假和未知
给出

关于C#中结果的解释和列举,您可以参考标题为“内”的部分。

将null宣布为未知

当然,还有一个镜像表,用于或:

true  | unknown => true        because the second operand does not matter. 
false | unknown => unknown       

它也适用于
&&
|

对&&和| |运算符都根据进行评估。这意味着一旦一个复杂表达式被确定为false,其余的表达式将不会被检查。由于第二个表达式中的false值足以确定逻辑AND的结果,因此直接将结果确定为false。

原因是您现在正在处理

  • 对于AND运算符(无论是&还是&),表达式结果可以在第一次匹配FALSE时确定
  • 对于OR运算符(无论是|还是| |),表达式结果可以在第一次匹配TRUE时确定
  • 对于任何最左边为NULL的布尔运算,操作数将返回NULL
因此,您列出的表是不完整的:您需要更多的条目来查看发生什么情况,因为有8种可能的输入组合(如果您计算
null运算符null
组合,则有9种)

以及:

或:


使用你的
朋友
类比,你可以说,对于三值逻辑,你倾向于将FALSE和NULL作为结果,而OR倾向于TRUE和NULL。

有关详细信息,请参阅真值表。我认为这可能是基本原理,但不确定。这不是,这是一种用户定义的转换。这与
|
相反:
null | | true==true
我认为在使用位运算符时,两个操作数都很重要?@haiyyu-两个操作数都会被计算,但
false&x
总是false,
x
是否为真、假或未知。请注意,短路
电路评估
(for&&和| | |)与表达式的结果无关。当结果可以确定时,短路求值仅停止求值子表达式,而正常求值始终求值所有子表达式,无论是否仍然需要它们的结果。
true  & unknown => unknown
false & unknown => false       because the second operand does not matter. 
true  | unknown => true        because the second operand does not matter. 
false | unknown => unknown       
X      |    Y     |   X & Y
---------------------------
true       null        null
null       true        null
false      null       false
null       false       null

true       false      false
true       true        true
false      true       false
false      false      false
X      |    Y     |   X | Y
---------------------------
true       null        true
null       true        null
false      null        null
null       false       null

true       false       true
true       true        true
false      true        true
false      false      false