最近,我有一个奇怪的错误,我在连接字符串与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");
在这个例子中两个表达式都是字符串,因此编译,但你想要的东西没有做。 在你的下一个例子的左侧??
运营商是一个字符串,而右手边是一个整数,所以它不会编译:
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
被连接,并且如果这将是空(它不能是),的字符串值0
和字符串"bar"
被连接起来。