j3d*_*j3d 5 .net c# operator-precedence
如果我使用Visual C#2010编译以下代码片段,我总是得到错误:
object o = null;
Console.WriteLine("Is null: " + o == null); // returns false
Run Code Online (Sandbox Code Playgroud)
有谁知道为什么???
Mar*_*uła 11
运算符优先级.
尝试
Console.WriteLine("Is null: " + (o == null));
Run Code Online (Sandbox Code Playgroud)
在您的代码中,First o添加到"Is null: "string,然后检查它是否为null.当然不是,所以评价为假.你的电话和你刚写的一样
Console.WriteLine(false.ToString());
Run Code Online (Sandbox Code Playgroud)
这就是为什么只打印"False",即使没有你的字符串.
And*_*ber 10
为什么容易; 想想你写的实际上是这样的:
object o = null;
Console.WriteLine(("Is null: " + o) == null); // returns false
Run Code Online (Sandbox Code Playgroud)
它的测试"Is null: " + o反对null,这将永远是false.这是由于运算符优先级,在规则+面前来==.
你应该明确地应用parens来确保它像你想要的那样工作:
Console.WriteLine("Is null: " + (o == null)); // returns true
Run Code Online (Sandbox Code Playgroud)
如Jim Rhodes的评论中所述:
这是您应该始终使用括号并且从不依赖编译器优先级规则的几个原因之一.
我注意到我同意; 我自己甚至都没有尝试记住运算符优先级规则,而是始终用parens表示.我进一步建议,这也是依赖隐式类型转换和/或具有多个重载的方法时要非常小心的一个原因.
我还想指出,我真的很喜欢Ravadre在回答中提到的一些内容 ; 关于为什么只打印"假",而不是你试图打印的全文.
其他答案已正确诊断出问题:连接的运算符优先级高于相等性.然而,没有人解决的是你的程序中更基本的错误,那就是你正在进行连接.编写代码的更好方法是:
Console.WriteLine("is null: {0}", obj == null);
Run Code Online (Sandbox Code Playgroud)
现在不可能存在运算符优先级问题,因为所讨论的表达式只有一个运算符.
通常,在执行输出时,应避免字符串连接,并支持字符串替换.它更容易正确,它更灵活,更容易本地化使用此技术编写的程序,等等.
| 归档时间: |
|
| 查看次数: |
344 次 |
| 最近记录: |