(对象)0 ==(对象)0

时间:2009-06-05 19:01:28

标签: c#

我想知道为什么在C#

0 == 0                   // return true 
(object) 0 == (object) 0 // return false

对我而言,它似乎比较了参考而不是比较演员的价值。

这来找我,因为使用Reflection我得到ValueType的默认值,它返回一个对象,当我将它与我的对象的当前值进行比较时,它返回两者不同但具有相同的值。 / p>

使用Equals或ToString可以处理ValueType对象,但不能使用ReferenceType,它可以为null,因此不允许使用Equals或ToString。

如果有人可以告诉我如何比较可以是任何类型的不同对象,null或具有值,因为object == object似乎是错误的方法。在这种情况下,我必须将我的对象重铸为原始类型,ReferenceType总是不同吗?

5 个答案:

答案 0 :(得分:25)

是的,它是拳击双方,并比较参考。每次打包时都会创建一个新对象,因此引用是不同的。

考虑到无效性,与Equals方法相比是可行的方法。最简单的方法是使用静态object.Equals(object, object)方法:

if (object.Equals(x, y))
{
    ...
}

答案 1 :(得分:4)

你是拳击,所以'cast'实际上确实为每个人创建了一个新对象。如果你要与你的对象进行比较,你可能需要编写自己的.Equals实现。

答案 2 :(得分:0)

基本上,上面是创建两个对象引用,将它们存储在内存中的不同位置,然后比较内存地址。由于这个原因,每次都会返回false。

比较我知道的两个对象的唯一方法是检查一个或两个对象是否为空(如果一个为空而不是另一个,它们不相等;我将它留给您的实现来确定是否为null == null)。如果两者都不为null,则可以安全地在对象上调用.equals。

答案 3 :(得分:0)

强制转换将强制装箱,它实质上会创建新对象,然后比较引用。如果您想要按内容比较对象(使用引用指向的对象的实现比较),您应该使用Equals方法:

Console.Write(((object)0).Equals((object)0)); // outputs "True"

答案 4 :(得分:0)

这可能会澄清一些事情。

对象零=(对象)0; return(object.Equals(zero,zero)); //返回true