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

Zac*_*Zac 19 c# nullable operators

在C#中,如果我写的话

int? x = null;
x += x ?? 1
Run Code Online (Sandbox Code Playgroud)

我希望这相当于:

int? x = null;
x = x + x ?? 1
Run Code Online (Sandbox Code Playgroud)

因此在第一个例子中,x将包含1如第二个例子中那样.但它没有,它包含null.+ =运算符在尚未分配时似乎不适用于可空类型.为什么会这样呢?

编辑:正如所指出的,这是因为null + 1 = null和运营商的优先级.在我的辩护中,我认为MSDN中的这一行含糊不清!:

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

Ken*_*rey 32

以下是两个陈述之间的区别:

x += x ?? 1
x = (x + x) ?? 1
Run Code Online (Sandbox Code Playgroud)

第二个不是你所期待的.

以下是它们的细分:

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
Run Code Online (Sandbox Code Playgroud)

  • +1啊,算子优先,我的古代敌人.你又来了! (7认同)
  • @AustinSalonen不.http://msdn.microsoft.com/en-us/library/6a71f45d.aspx (4认同)
  • 啊,我没有意识到null + 1 = null.错过了MSDN中的这一行:预定义的一元和二元运算符以及值类型存在的任何用户定义的运算符也可以由可空类型使用.如果操作数为null,则这些运算符产生空值; 否则,运算符使用包含的值来计算结果. (2认同)