为什么 && 和 ||不能用于可为空的类型

本文关键字: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