为什么 && 和 ||不能用于可为空的类型
本文关键字:amp 类型 不能 为什么 用于 | 更新日期: 2023-09-27 17:57:10
可能的重复项:
AND 操作不能在可为空的布尔值之间应用。
我希望类似的行为,例如 + 或 *。因此,如果任何操作数为 null,它应该返回 null,但如果它在 &&或 || 中使用,编译会抱怨。为什么?
为了说明这一点:
//this compiles
int? x = null;
int? y = null;
var z = x*y;
// this doesn't compile
bool? x = null;
bool? y = null;
if(x && y)
....
如果它返回 null
,那么你会使布尔要求无效。
||
&&
基本上,它将允许在 if
语句中使用 bool
以外的值(特别是 null
),这将是未定义的行为,因为if
语句需要bool
ean 表达式。
有趣的是,这是Java和C#不同的领域之一。Java也需要if
语句中的布尔值,但它们允许null
它们的bool?
版本(Nullable<bool>
,或者只是Java中的Boolean
)。这会导致运行时出现一些意外的NullPointerException
,C# 通过此要求避免了这种情况。
可能是因为 && 和 || 是短路运算符。您可以使用 & 和 |用布尔?我相信你会得到三值逻辑 - null 被视为"未知"。所以 false & null 是 false,但 true & null 是 null。这足以令人困惑,无法跟踪,而不会造成短路!面对空值,短路实际上可能没有任何用处。
编辑 - 考虑到这一点,短路对于三值逻辑仍然有意义。左侧为 false 的逻辑 AND 将始终计算 false,即使右侧为 null。左侧为 true 的逻辑 OR 将始终计算为 true,即使右侧为 null 也是如此。我想这是"不值得努力实现"的功能之一。有时你需要短路布尔逻辑。有时你需要三值布尔逻辑。但两者很少重叠。
即使 (x && y) 是可能的,结果也是布尔值?而不是布尔值。如果 () 仅适用于布尔值。
试试 if ((bool)(x ?? false)) && (bool)(y ?? false))。
或者更好的是,按照Weebles的回答:
如果(x & y == true)。
可为空的类型实际上是对象。将可为 null 的运算符"?"应用于值类型(如 bool)时,它将成为对保存"null"或基础值类型的值的对象的引用。
考虑一下:
bool? isActive;
这实际上变成了:
Nullable<bool> isActive;
值类型实际上成为对象实例,因此不像常规值类型那样参与布尔表达式。
更多信息: http://msdn.microsoft.com/en-us/library/1t3y8s4s.aspx