c# - C# 空合并 (??) 运算符的运算符优先级是什么?

标签 c# null 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 spec 中(Word 文档)和 ECMA-334 , 加法比 ?? 结合得更紧密,后者比赋值结合得更紧密。 IMO,另一个答案中给出的 MSDN 链接是错误且奇怪的。 2008 年 7 月在页面上显示了一个更改,它移动了条件运算符 - 但显然不正确!

关于c# - C# 空合并 (??) 运算符的运算符优先级是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/511093/

相关文章:

c# - 使用 Razor 在 Cshtml 页面上的条件语句

c# - 空合并运算符和 lambda 表达式

c# - 如何在 linq 中将空列表视为空列表?

c# - 如何在较高级别指定要使用的数据库隔离级别?

c# - 通过 C# 代码更改皮肤文件

c# - 如何在winform列表框中隐藏列?

sql - 合并两列并添加到一个新列中

java - 有没有办法检查 or 语句中的哪个条件导致代码运行?

c# - Linq Where 表达式中的空检查 String.ToLower

angular - 空合并运算符 Angular 2