测试空引用总是返回 false.即使为空

本文关键字:false 引用 测试 返回 | 更新日期: 2023-09-27 18:22:27

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

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

有人知道为什么吗???

测试空引用总是返回 false.即使为空

运算符优先级。

尝试

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

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

Console.WriteLine(false.ToString());

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

为什么很容易;想想你写的东西实际上是这样的:

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

它正在测试"Is null: " + onull,这将永远是false。这是由于运算符优先级规则,其中+==之前。

您应该显式应用括号以确保它按预期工作:

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

正如Jim Rhodes的评论中所指出的:

这是您应该始终使用括号并且永远不要依赖编译器优先级规则的几个原因之一。

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

我还想指出,我真的很喜欢拉瓦德雷在他们的回答中提到的一些东西;为什么只打印了"假",而不是你试图打印的全文。

其他答案已经正确诊断了问题:串联的运算符优先级高于相等。然而,没有人解决的是程序中更根本的错误,即您根本不在做串联。 编写代码的更好方法是:

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

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

通常,在执行输出时,应避免字符串串联,而倾向于字符串替换。更容易做到正确,更灵活,更容易本地化使用这种技术编写的程序,等等。