如果我编译下面的代码片段使用Visual C#2010我总是得到假:测试的空引用总是返回false ...甚至当空
object o = null;
Console.WriteLine("Is null: " + o == null); // returns false
有谁知道为什么???
如果我编译下面的代码片段使用Visual C#2010我总是得到假:测试的空引用总是返回false ...甚至当空
object o = null;
Console.WriteLine("Is null: " + o == null); // returns 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在评论中指出:
这是几个原因,你应该总是用一个括号并且从不依赖编译器优先级规则。
我注意到自己,我同意;我甚至不想尝试自己记住运营商优先规则,而是始终明确与parens。我进一步建议,这也是在依赖隐式类型转换和/或具有多个重载的方法时要非常小心的一个原因。
我还想指出,我真的很喜欢 their answer中指出;关于为什么只打印“False”,而不是你想要打印的全部文本。
运算符优先级。
尝试
Console.WriteLine("Is null: " + (o == null));
在代码中,首先o
被添加到字符串"Is null: "
中,然后检查是否为空。当然不是,所以它被评估为错误。您的来电是一样的,如果你只是写
Console.WriteLine(false.ToString());
这就是为什么只有“假”打印,即使没有你的字符串。
好的补充说明它如何只显示“False”,而不是“False” – 2012-02-05 16:16:44
其他答案已正确诊断问题:连接的运算符优先级高于相等。然而,没有人解决过你的程序中最基本的错误,那就是你正在进行连接。编写代码的更好方法是:
Console.WriteLine("is null: {0}", obj == null);
现在不可能存在运算符优先级问题,因为所讨论的表达式只有一个运算符。
一般来说,在执行输出时,应该避免字符串连接,并支持字符串替换。它更容易做到,它更加灵活,更易于本地化使用这种技术编写的程序,等等。
但是,如果连接不包含表达式(只有变量,甚至可能是常量)并且它很简短吗?在许多情况下,级联更短,更清晰并且性能更好。你对这些论点有什么看法? – Konstantin 2012-02-07 11:14:46
这是你为什么总是使用圆括号而不依赖于编译器优先规则的几个原因之一。 – 2012-02-05 14:36:45
@JimRhodes确实;我甚至不想自己记住运营商优先规则。如果它可能*是一个问题,我明确指出我的代码中的优先顺序。这个例子也是*一个例子,显示依赖显式类型转换可能导致混淆。 – 2012-02-05 14:39:48