怪异运算符优先级? (空合并运算符) 怪异运算符优先级? (空合并运算符)(Weird ope

2019-05-12 00:45发布

最近,我有一个奇怪的错误,我在连接字符串与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;

谁能解释这是如何工作给我吗?

Answer 1:

空合并经营者具有非常低的优先级 ,以便您的代码被解释为:

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

在这个例子中两个表达式都是字符串,因此编译,但你想要的东西没有做。 在你的下一个例子的左侧?? 运营商是一个字符串,而右手边是一个整数,所以它不会编译:

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";


Answer 2:

?? 运营商具有较低的优先级比+运算符,让你表达真正起作用的:

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

第一字符串"foo"和的字符串值x被连接,并且如果这将是空(它不能是),的字符串值0和字符串"bar"被连接起来。



文章来源: Weird operator precedence with ?? (null coalescing operator)