C#null-coalescing(??)运算符的运算符优先级是什么?

我刚试过以下内容,想法是连接两个字符串,用空字符串替换空值。

string a="Hello"; string b=" World"; 

– 调试(有趣的是?是打印,并不完全有助于提高可读性……)

  ? a ?? "" + b ?? "" 

– >“你好”

正确的是:

 ? (a??"")+(b??"") "Hello World" 

如果a为null,我有点期待“Hello World”,或者只是“World”。 显然,这是运算符优先级的todo,可以通过括号来克服,是否存在记录此新运算符的优先顺序的任何位置。

(意识到我应该使用stringbuilder或String.Concat)

谢谢。

除了你想要的优先级,ECMA是什么,根据MS规范是什么以及csc实际上做了什么,我有一点建议:

不要这样做

我认为写起来清楚得多

 string c = (a ?? "") + (b ?? ""); 

或者,假设字符串连接中的null最终只是一个空字符串,只需写:

 string c = a + b; 

编辑:关于记录的优先顺序,在C#3.0规范 (Word文档)和ECMA-334中 ,加法绑定比绑定更严格,绑定比绑定更严格。 在另一个答案中给出的MSDN链接是错误的,奇怪的,IMO。 2008年7月页面上显示的更改移动了条件运算符 – 但显然不正确!

永远不要依赖运营商优先权。 始终明确指定您希望代码的行为方式。 当你回到代码中时,请帮助自己和他人。

 (a ?? "") + (b ?? "") 

这没有留下任何歧义的余地。 歧义是臭虫的滋生地。

MSDN上记录了运算符优先级。

但是,MSDN的优先级与微软的可下载C#规范和ECMA 规范的优先级相矛盾。 这有点奇怪。

无论如何,正如Jon Skeet在他的回答中所说,最好不要依赖运营商的优先权,而是通过使用括号来明确。

有趣的是, http : //msdn.microsoft.com/en-us/library/6a71f45d.aspx和http://en.csharp-online.net/ECMA-334:_14.2.1_Operator_precedence_and_associativity给出了不同的优先级。

MSDN:

  1. 条件
  2. 分配
  3. 空 – 结合
  4. LAMBDA

ECMA:

  1. 空融合
  2. 条件
  3. 分配

我认为msdn一定是错的,考虑一下:

 string a = null; string b = a ?? "foo"; // What is b now?