为什么下面的表达式不同?
[1] (object)0 == (object)0 //false
[2] ((object)0).Equals((object)0) // true
实际上,我可以完全理解1,因为.NET运行时可能会box
整数并开始比较引用。但是为什么2是不同的呢?
发布于 2013-12-18 02:46:42
调用行为不同的原因是它们绑定到非常不同的方法。
==
用例将绑定到静态引用相等运算符。创建了2个独立的盒装int
值,因此它们不是相同的引用。
在第二种情况下,绑定到实例方法Object.Equals
。这是一个虚方法,它将向下过滤到Int32.Equals
,并检查装箱的整数。两个整数值都是0,因此它们是相等的
发布于 2013-12-18 02:47:55
==
操作符是静态的,不是虚拟的。它将运行object
类定义的完全相同的代码(`object是操作数的编译时类型),该代码将执行引用比较,而不考虑任何对象的运行时类型。
Equals
方法是一个虚拟实例方法。它将运行(第一个)对象的实际运行时类型中定义的代码,而不是object
类中的代码。在本例中,对象是一个int
,因此它将执行值比较,因为这是int
类型为其Equals
方法定义的值。
发布于 2013-12-18 02:46:45
Equals()
方法是虚拟的。
因此,即使调用站点被强制转换为object
,它也总是调用具体的实现。int
覆盖Equals()
以按值进行比较,因此您可以进行值比较。
https://stackoverflow.com/questions/20642202
复制相似问题