繁体   English   中英

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

[英]What is the operator precedence of C# null-coalescing (??) operator?

我刚刚尝试了以下方法,其想法是将两个字符串连接起来,用一个空字符串代替空值。

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

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

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

->“你好”

正确的是:

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

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

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

谢谢。

除了您希望优先级是什么、根据 ECMA 是什么、根据 MS 规范是什么以及 csc 实际做什么之外,我还有一点建议:

不要这样做

我认为写得清楚:

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

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

string c = a + b;

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

永远不要依赖运算符优先级。 始终明确指定您希望代码如何运行。 当您回到您的代码时,请帮自己和他人一个忙。

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

这没有任何模棱两可的余地。 歧义是错误的温床。

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

然而,MSDN 上的优先级与来自 Microsoft 的可下载 C# 规范ECMA 上的规范的优先级相矛盾。 这有点奇怪。

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

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

微博:

  1. 有条件的
  2. 任务
  3. 空合并
  4. 拉姆达

ECMA:

  1. 空值合并
  2. 有条件的
  3. 任务

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM