23

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

有人可以向我解释这是如何工作的吗?

4

2 回答 2

27

空合并运算符的优先级非常低,因此您的代码被解释为:

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";
于 2010-07-15T19:47:50.737 回答
11

??运算符的优先低于+运算符,因此您的表达式实际上是:

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

首先将字符串"foo"和字符串值x连接起来,如果它为空(不可能),则将字符串值0和字符串"bar"连接起来。

于 2010-07-15T19:47:51.753 回答