奇怪的运算符优先级与?? (null合并运算符)

最近我有一个奇怪的错误,我用字符串连接int? 然后在那之后添加另一个字符串。

我的代码基本上相当于:

 int? x=10; string s = "foo" + x ?? 0 + "bar"; 

令人惊讶的是,这将运行和编译没有警告或不兼容的类型错误,这将是:

 int? x=10; string s = "foo" + x ?? "0" + "bar"; 

然后这会导致意外的类型不兼容错误:

 int? x=10; string s = "foo" + x ?? 0 + 12; 

这个更简单的例子也是如此:

 int? x=10; string s = "foo" + x ?? 0; 

有人能解释一下这对我有用吗?

空合并运算符的优先级非常低,因此您的代码被解释为:

 int? x = 10; string s = ("foo" + x) ?? (0 + "bar"); 

在这个例子中,两个表达式都是字符串,所以它编译,但不会做你想要的。 在你的下一个例子中,左侧是?? operator是一个字符串,但右边是一个整数,因此它不能编译:

 int? x = 10; string s = ("foo" + x) ?? (0 + 12); // Error: Operator '??' cannot be applied to operands of type 'string' and 'int' 

解决方案当然是添加括号:

 int? x = 10; string s = "foo" + (x ?? 0) + "bar"; 

?? 运算符的优先级低于+运算符,因此表达式的确如下:

 string s = ("foo" + x) ?? (0 + "bar"); 

首先,字符串"foo"x的字符串值是连接的,如果它是null(它不能),则字符串值0和字符串"bar"连接在一起。