我有两行编码如下
int? i = 1;
int j = i ?? 2 +1;
now "j is 1"
int? i = 1;
int j = (i ?? 2) +1;
now "j is 2"
你能解释一下吗?
答案 0 :(得分:2)
当然 - 这是一个简单的优先事项。 (Microsoft)C#规范列出了7.3.1节中的运算符优先级(无论如何,在C#4和C#5规范中;它在C#3规范中是7.2.1),尽管这只是一个信息丰富的表 - 它实际上由语法。
无论如何,null-coalescing运算符(??
)的优先级低于二进制加法运算符(+
),所以你的第一个代码相当于:
int? i = 1;
int j = i ?? (2 + 1);
由于i
的值非空,因此甚至不评估空合并运算符的右手操作数 - i ?? (2 + 1)
的结果仅为1.
将其与第二个示例进行比较,其中null-coalescing运算符表达式再次计算为1,但随后将1添加到该结果中。这是有效的:
int tmp = i ?? 2; // tmp is now 1
int j = tmp + 1; // j is 2
关联性在这里是无关紧要的,它只控制在两个具有相同优先级的运算符之间出现操作数时的排序/分组。
答案 1 :(得分:1)
如果不使用??运算符
,也许您会更好地理解它情景1:
int? i = 1;
int j;
if (i != null)
{
//i is not null so this is hit
j = i;
}
else
j = 2 + 1;
}
所以j = 1
情景2:
int? i = 1;
int j;
if (i != null)
{
//i is not null so this is hit
j = i;
}
else
j = 2;
}
所以j = 1
//No matter the result of the above if, 1 is always added.
j = j + 1;
所以j = 2
答案 2 :(得分:0)
SpMx
现在j是1
int? i = 1;
int j = i ?? 2 + 1; //If I is null make j = to 3
现在j是2