为什么(Object)0==(Object)0与((Object)0).Equals((Object)0)不同?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (63)

为什么下面的表达式不同?

[1]  (object)0 == (object)0 //false
[2]  ((object)0).Equals((object)0) // true

实际上,我完全能理解一因为.NET运行时可能会box整数,然后开始比较引用。但为什么二不一样?

提问于
用户回答回答于

调用行为不同的原因是它们绑定到非常不同的方法。

==case将绑定到静态引用相等操作符。有两个独立的盒子int所创建的值因此它们不是相同的引用。

在第二种情况下,绑定到实例方法。Object.Equals。这是一个虚拟方法,它将过滤为Int32.Equals它检查一个装箱整数。这两个整数值都是0,因此它们是相等的。

用户回答回答于

当转换int值时0(或任何其他价值类型)object,其价值是盒装。每一次向object生成不同的框(即不同的对象实例)。==操作符object类型执行引用比较,因此它返回false,因为左侧和右侧不是相同的实例。

另一方面,当你使用Equals,它是一个虚拟方法,它使用实际装箱类型的实现,即Int32.Equals,因为两个对象的值相同,所以返回true。

扫码关注云+社区