对null引用的测试总是返回false ...即使为null

时间:2012-02-05 14:29:46

标签: c# .net operator-precedence

如果我用Visual C#2010编译以下代码片段,我总是得到错误:

object o = null;
Console.WriteLine("Is null: " + o == null); // returns false

有人知道为什么???

3 个答案:

答案 0 :(得分:11)

运营商优先权。

尝试

Console.WriteLine("Is null: " + (o == null));

在您的代码中,首先将o添加到"Is null: "字符串,然后检查该字符串是否为空。当然不是,所以评价为假。你的电话和你刚写的一样

Console.WriteLine(false.ToString());

这就是为什么只打印“False”,即使没有你的字符串。

答案 1 :(得分:10)

为什么容易;想想你写的是实际存在的东西:

object o = null;
Console.WriteLine(("Is null: " + o) == null); // returns false

正在针对"Is null: " + onull进行测试,false始终为+。这是由于运算符优先级的规则,其中==位于Console.WriteLine("Is null: " + (o == null)); // returns true 之前。

您应该明确应用parens以确保它的工作方式符合您的要求:

{{1}}

正如Jim Rhodes的评论所述:

  

这是为什么你应该总是使用括号而不依赖于编译器优先规则的几个原因之一。

我注意到我同意;我自己甚至没有尝试来记住运算符优先级规则,而是始终用parens来表示。我进一步建议,这也是依赖隐式类型转换和/或具有多个重载的方法时要非常小心的一个原因。

我还想指出,我真的很喜欢Ravadre中提到的their answer内容;关于为什么只打印“假”,而不是你试图打印的全文。

答案 2 :(得分:8)

其他答案已正确诊断出问题:连接的运算符优先级高于相等性。然而,没有人解决的是你的程序中更基本的错误,那就是你正在进行连接。编写代码的更好方法是:

Console.WriteLine("is null: {0}", obj == null);

现在不可能存在运算符优先级问题,因为所讨论的表达式只有一个运算符。

通常,在执行输出时,应避免字符串连接,并支持字符串替换。它更容易正确,它更灵活,更容易本地化使用这种技术编写的程序,等等。