C#null合并(?)运算符的运算符优先级是多少?
我刚刚尝试了以下方法,其想法是将两个字符串连接起来,用空字符串替换空字符串C#null合并(?)运算符的运算符优先级是多少?,c#,null,null-coalescing-operator,C#,Null,Null Coalescing Operator,我刚刚尝试了以下方法,其想法是将两个字符串连接起来,用空字符串替换空字符串 string a="Hello"; string b=" World"; --调试(有趣的是,这是打印,对可读性没有帮助…) ->“你好” 正确答案是: ? (a??"")+(b??"") "Hello World" 我有点期待“Hello World”,或者如果a为空,则只是“World”。显然,这是运算符优先级的todo,可以通过括号来克服。是否有任何地方记录了此新运算符的优先级顺序 (意识到我可能应该使用str
string a="Hello";
string b=" World";
--调试(有趣的是,这是打印,对可读性没有帮助…)
->“你好”
正确答案是:
? (a??"")+(b??"")
"Hello World"
我有点期待“Hello World”,或者如果a为空,则只是“World”。显然,这是运算符优先级的todo,可以通过括号来克服。是否有任何地方记录了此新运算符的优先级顺序
(意识到我可能应该使用stringbuilder或String.Concat)
谢谢。上记录了运算符优先级 但是,MSDN上的优先级与中的优先级相矛盾,也与Microsoft提供的和中的优先级相矛盾。这有点奇怪 不管怎样,正如Jon Skeet在他的回答中所说,最好不要依赖于运算符的优先级,而是通过使用括号来明确表示。这很有趣,并且给了不同的优先级 msdn:
string a = null;
string b = a ?? "foo";
// What is b now?
永远不要依赖运算符优先级始终明确指定代码的执行方式。当你回到你的代码时,帮你自己和别人一个忙
(a ?? "") + (b ?? "")
这一点不容含糊。模糊性是错误的滋生地。除了您希望的优先顺序、ECMA的优先顺序、MS规范的优先顺序以及csc的实际工作之外,我还有一点建议:
不要这样做
我认为这样写更清楚:
string c = (a ?? "") + (b ?? "");
或者,如果字符串串联中的null最终只是一个空字符串,只需编写:
string c = a + b;
编辑:关于文档中的优先级,在(Word文档)和中,加法绑定比???更紧,后者绑定比赋值更紧。在另一个答案中给出的MSDN链接是错误和奇怪的,国际海事组织。2008年7月的页面上显示了一个改变,移动了有条件的操作员,但显然是错误的 干杯。搜索??在谷歌显然不是这样。非常恼人的是,它太低了。我认为这一定是错误的-请参阅ECMA参考,并考虑:string a=null;字符串b=a??“福”;什么是b?MSDN页面肯定是错误的-它与微软自己的规范相矛盾。保留答案,因为MSDN链接应该给出正确的答案。希望微软能解决这个问题。如果有人认为我应该删除,请在评论中告诉我。谢谢。我认为你不应该删除它,但我建议你编辑答案,解释MSDN页面没有反映可下载的C#spec的内容。定义“当它重要时”-你会将其用于a+b*C吗?即使你认为这太模棱两可了,我怀疑我可以找到一些例子,但每个人都认为这是显而易见的。我同意一般的想法,但不太清楚你会走多远:)我可能也会在你的例子中使用它。我宁愿把它明确地告诉我,也不愿去想,哪怕是一秒钟。这一秒的思考给了我犯错的机会。意识到我的立场有多么极端,我删除了“当它重要的时候”。虽然我不会用括号括起x+y+z,但我觉得用极端语句可以让我的观点更清楚。好吧,这里有一个例子——你总是用括号括起关联性和优先级吗?其中一件好事是??就是你可以写“a??b??c??d”。考虑到这是一个相当惯用的用法,我认为它比??(b)(c)(d)。但不可否认,这不是优先权:)那样的话,我会像你一样写。不过,我可以避免不惜一切代价编写这样做的代码!;)我没有意识到字符串串联中的空值的意义。很好。有趣的是:字符串s=null将s赋值为null,而字符串s=null+null将s赋值为“”,表示“不要这样做”,+1是不够的。尝试这样的方法很有趣:int?a=4;智力?b=5;int结果=a??0+b??0; 结果如何?9? 不!四点了!当a不为null时,结果仅为a。如果你想得到9,你必须做:int结果=(a??0)+(b??0);因此,在这些情况下,请始终使用括号。@FranciscoGoldenstein更好:类似于SomeMethod(a??0+b??0)的东西仍然使用4作为被调用方法的输入参数值(考虑到上面所写的内容,这完全有意义,但如果您不知道,可能会让您更加困惑)
string c = a + b;