最近我遇到了一个奇怪的错误,我将一个字符串与一个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;
有人能解释一下这对我有用吗?
答案 0 :(得分:26)
空合并运算符的precedence非常低,因此您的代码被解释为:
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";
答案 1 :(得分:11)
??
运算符的precedence运算符低于+
运算符,因此您的表达式确实如下:
string s = ("foo" + x) ?? (0 + "bar");
首先将字符串"foo"
和字符串值x
连接起来,如果它是null(它不能),则字符串值0
和字符串"bar"
连接在一起。