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

时间:2010-07-15 19:44:36

标签: c# types null-coalescing-operator

最近我遇到了一个奇怪的错误,我将一个字符串与一个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;

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

2 个答案:

答案 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"连接在一起。