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

时间:2012-10-03 15:39:07

标签: c# operators nullable

在C#中,如果我写

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

我希望这相当于:

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

因此在第一个示例中,x将包含1,如第二个示例中所示。但它没有,它包含null。 + =运算符在尚未分配时似乎不适用于可空类型。为什么会出现这种情况?

编辑:正如所指出的,这是因为null + 1 = null和运营商优先级。在我的辩护中,我认为MSDN中的这一行是模棱两可的!:

  

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

1 个答案:

答案 0 :(得分: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