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

C# +;=C中具有可为空类型的运算符#,c#,operators,nullable,C#,Operators,Nullable,在C#中,如果我写 int? x = null; x += x ?? 1 我认为这相当于: int? x = null; x = x + x ?? 1 因此,在第一个示例中,x将包含第二个示例中的1。但它没有,它包含null。+=运算符似乎不适用于未分配的可空类型。为什么会这样 Edit:如前所述,这是因为null+1=null和运算符优先级。在我的辩护中,我认为这句话是模棱两可的!: 预定义的一元和二元运算符以及任何用户定义的 值类型存在的运算符也可由nullable使用 类型。这些运算符

在C#中,如果我写

int? x = null;
x += x ?? 1
我认为这相当于:

int? x = null;
x = x + x ?? 1
因此,在第一个示例中,
x
将包含第二个示例中的
1
。但它没有,它包含null。+=运算符似乎不适用于未分配的可空类型。为什么会这样

Edit:如前所述,这是因为
null+1=null
和运算符优先级。在我的辩护中,我认为这句话是模棱两可的!:

预定义的一元和二元运算符以及任何用户定义的 值类型存在的运算符也可由nullable使用 类型。这些运算符在以下情况下生成空值: 操作数为空;否则,运算符将使用包含的值 计算结果


以下是这两种说法的区别:

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

+1啊,我的宿敌。你又罢工了!难道
??
不比
+
优先吗?(@Servy的回答)啊,我没能理解null+1=null。MSDN中缺少这一行:预定义的一元运算符和二元运算符以及存在于值类型中的任何用户定义运算符也可能被可空类型使用。如果操作数为空,这些运算符将生成空值;否则,运算符将使用包含的值来计算结果。