繁体   English   中英

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

[英](object) 0 == (object) 0

我想知道为什么在C#中

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

在我看来,它是在比较参考而不是在比较投射的值。

之所以出现这种情况,是因为通过反射,我得到了ValueType的默认值,该值返回一个对象,当我将其与我的对象的当前值进行比较时,它返回两者并不相同但具有相同的值。

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

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

是的,将两边都装箱,然后比较参考文献。 每次装箱时都会创建一个新对象,因此引用是不同的。

考虑到无效性,与Equals方法进行比较是必经之路。 最简单的方法是使用静态object.Equals(object, object)方法:

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

您正在拳击,因此“ cast”实际上确实为每个对象创建了一个NEW对象。 如果要与对象进行比较,则可能必须编写自己的.Equals实现。

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

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

强制转换将强制装箱,这实际上会创建新对象,然后将引用进行比较。 如果要按内容比较对象(使用引用所指向的对象的已实现比较),则应使用Equals方法:

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

这可能会澄清一些事情。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM