2012-07-26 101 views
1

这看起来应该是非常简单的。如何在c中将对象与null进行比较#

,如果我有:

object obj = *get value from somewhere* 

if(obj == null){ 
    MessageBox.Show("NULL"); 
} 

即使当我调试,并看到obj为null,该代码永远不会进入if语句。

比较对象为null时,你有做过不同的事情吗? (因为一个对象可以是任何类型?)

+7

目前,我只是不相信你。我怀疑你是在误诊某事。请制作一个简短但完整的*程序来说明问题。 – 2012-07-26 20:11:59

+0

我假设代码是'if(obj == null)'? – Pedro 2012-07-26 20:12:42

+0

有一个想法:在你的*实际代码中,obj是实际静态类型为object的吗?如果不是,那么你可能会看到一些疯狂的'=='超载行为。要在超安全的一面,你总是可以使用'ReferenceEquals(obj,null)'代替。 – 2012-07-26 20:13:32

回答

13

好吧,注释的给它远离:

好的,在这样做时,我注意到当我将鼠标悬停在调试模式下的变量上时,该值为null,但是当它工作时,值为{null} ... {null}是什么意思?

这表明它实际上是一个包含单个空引用的数组(或可能是另一个集合类型),例如,

object obj = new object[] { null }; 

obj值是空引用,因此它不会进入if语句体。

你应该如何处理这取决于你想要达到的目标。你真的需要obj被静态输入为object

+0

我相信如此...我想不出一个更好的方式来做到这一点。我正在尝试使一种方法可以对任何(我选择)类型的列表进行排序。 – Toadums 2012-07-26 20:25:36

+0

我打算obj = records [0] .GetValue(T),它返回一个字符串,int,Project,Phase或Client。出于某种原因,当阶段为空时,它被设置为{null} ...即使它不是一个列表。那是什么意思? (阶段是一个自定义类)。哦,我正在使用FirstorDefault来获得阶段。默认...默认是{null}? – Toadums 2012-07-26 20:26:19

+0

@Toadums:你确定它没有返回一个'Phase'对象,它以一种返回null的方式覆盖'ToString'?如果你能展示一个简短但完整的程序来展示这个问题,它将*非常有用。你应该从一开始就告诉我们这一切。 – 2012-07-26 20:34:45

10

你需要

if(obj == null){ 
    MessageBox.Show("NULL"); 
} 

基于

你写的类型对象,而不是你的变量OBJ

UPDATE你的编辑(它会改变这个问题),你的代码肯定会起作用。试试你的如果语句之前分配

obj = null; 

,并看到它进入MessageBox.Show()

这将证明如果不工作,你希望它应该。

更新2

@乔恩击中它,你可能已经分配的数组一个元素,空了脑袋。它以这种方式显示的原因是调试器试图显示数组。

如果阵列有例如两个字符串元素“你好”和“世界”的调试器会显示

{“你好”,“世界”}

由于数组只有一个元素,空,调试器可视化这是

{NULL}

+0

errr..ya,它在代码中是obj。只是在将它写出到stackoverflow时发生错误。 – Toadums 2012-07-26 20:12:09

+0

好的,在这样做时,我注意到当我将鼠标悬停在调试模式下的变量上时,该值为null,但是当它工作时,值为{null} ... {null}是什么意思? – Toadums 2012-07-26 20:15:55

相关问题