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

时间:2009-02-04 12:13:07

标签: c# null null-coalescing-operator

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

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

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

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

- > “你好”

正确的是:

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

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

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

感谢。

4 个答案:

答案 0 :(得分:35)

除了你喜欢的优先顺序,根据ECMA是什么,根据MS规范它是什么以及csc实际上做了什么,我有一点建议:

不要这样做

我认为 更清楚地写道:

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

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

string c = a + b;

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

答案 1 :(得分:6)

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

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

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

答案 2 :(得分:5)

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

然而,MSDN的优先级与微软downloadable C# specspec on ECMA的优先级相矛盾。这有点奇怪。

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

答案 3 :(得分:2)

有趣的是http://msdn.microsoft.com/en-us/library/6a71f45d.aspxhttp://en.csharp-online.net/ECMA-334:_14.2.1_Operator_precedence_and_associativity赋予了不同的优先权。

MSDN:

  1. 有条件的
  2. 作业
  3. Null-coalescing
  4. Lambda
  5. ECMA:

    1. Null Coalescing
    2. 条件
    3. 作业
    4. 我认为msdn一定是错的,请考虑:

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