C#中的可空类型与+=运算符

20
在C#中,如果我写下

int? x = null;
x += x ?? 1

我希望这与以下内容等效:

我期望这个与以下内容等价:

int? x = null;
x = x + x ?? 1

因此,在第一个例子中,x应该包含1,就像第二个例子一样。但它没有,它包含null。当可空类型没有被赋值时,+=运算符似乎不起作用。为什么会这样呢? 编辑:正如指出的那样,这是因为null + 1 = null和运算符优先级。为了辩护自己,我认为MSDN中的这行文字有歧义!:

预定义的一元和二元运算符以及任何存在于值类型中的用户定义运算符也可以被可空类型使用。如果[任意一个]操作数为null,则这些运算符会产生null值;否则,运算符使用包含的值来计算结果。

1个回答

33

这是这两个语句之间的区别:

x += x ?? 1
x = (x + x) ?? 1

第二个不是你所期望的。

以下是它们的区别:

x += x ?? 1
x += null ?? 1
x += 1
x = x + 1
x = null + 1
x = null

x = x + x ?? 1
x = null + null ?? 1
x = null ?? 1
x = 1

7
+1 哦,运算符优先级,我的古老敌人。你又来了! - JDB
?? 优先级高于 + 吗?(@Servy 的回答) - Austin Salonen
2
啊,我没意识到 null + 1 = null。在 MSDN 中错过了这一行:预定义的一元和二元运算符以及任何存在于值类型中的用户定义运算符也可以被可空类型使用。如果操作数为 null,则这些运算符会产生一个 null 值;否则,运算符使用包含的值来计算结果。 - Zac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接