【发布时间】:2012-02-05 14:29:46
【问题描述】:
如果我使用 Visual C# 2010 编译以下代码 sn-p,我 总是 得到错误:
object o = null;
Console.WriteLine("Is null: " + o == null); // returns false
有人知道为什么吗???
【问题讨论】:
标签: c# .net operator-precedence
如果我使用 Visual C# 2010 编译以下代码 sn-p,我 总是 得到错误:
object o = null;
Console.WriteLine("Is null: " + o == null); // returns false
有人知道为什么吗???
【问题讨论】:
标签: c# .net operator-precedence
运算符优先级。
试试
Console.WriteLine("Is null: " + (o == null));
在您的代码中,首先将o 添加到"Is null: " 字符串,然后检查它是否为空。当然不是,所以它被评估为假。你的调用和你写的一样
Console.WriteLine(false.ToString());
这就是为什么只打印“False”,即使没有你的字符串。
【讨论】:
为什么容易;想想你写的实际上是这样的:
object o = null;
Console.WriteLine(("Is null: " + o) == null); // returns false
它正在测试 "Is null: " + o 和 null,这将始终是 false。这是由于运算符优先级规则,+ 在 == 之前。
您应该明确应用括号以确保它按您想要的方式工作:
Console.WriteLine("Is null: " + (o == null)); // returns true
Jim Rhodes 在 cmets 中指出:
这是您应该始终使用括号并且从不依赖编译器优先规则的几个原因之一。
我表示自己同意;我什至没有尝试自己记住运算符优先规则,而是一直用括号明确表示。我进一步建议,这也是在依赖隐式类型转换和/或具有多个重载的方法时要非常小心的原因之一。
我还想指出,我真的很喜欢Ravadre 在their answer 中提到的东西;关于为什么只打印“False”,而不是您尝试打印的整个文本。
【讨论】:
其他答案已正确诊断出问题:连接的运算符优先级高于相等。然而,没有人解决的是你的程序中更根本的错误,那就是你正在做连接。编写代码的更好方法是:
Console.WriteLine("is null: {0}", obj == null);
现在不可能存在运算符优先级问题,因为所讨论的表达式只有一个运算符。
一般来说,在执行输出时,您应该避免字符串连接,并支持字符串替换。它更容易正确,更灵活,更容易本地化使用这种技术编写的程序,等等。
【讨论】: