我想知道为什么在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总是不同吗?
答案 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