C# 带??(空合并运算符)

C# 带??(空合并运算符),c#,types,null-coalescing-operator,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 +

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

啊,由于优先级较低,两边几乎形成了两个独立的表达式这就解释了为什么
int x=10;字符串s=“foo”+x??"0";在一个相关的问题上起作用:这里有一个链接不能让我的答案发光。。。