2012-10-03 41 views
19

在C#,如果我写与空类型+ =操作符在C#

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

我期望这是等效于:

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

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

编辑:正如指出的那样,这是因为null + 1 = null和运算符的优先级。在我的防守,我觉得这条线在MSDN是模糊的!:

预定义的一元和二元运营商和用户定义的任何 运营商存在的值类型也可以通过可空类型 使用。如果[或 的任一个操作数为空,则这些运算符产生空值;否则,操作员使用所包含的值来计算结果 。

回答

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

+0

不是'??'优先于'+'吗? (@ Servy的回答) –

+4

@AustinSalonen Nope。 http://msdn.microsoft.com/en-us/library/6a71f45d.aspx –