Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#null合并(?)运算符的运算符优先级是多少?_C#_Null_Null Coalescing Operator - Fatal编程技术网

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:

  • 有条件的
  • 分配
  • 零聚结
  • 兰姆达
  • ECMA:

  • 零聚结
  • 有条件的
  • 分配
  • 我认为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;