奇怪的运算符优先级与?? (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"
连接在一起。