首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么(object)0 == (object)0和((object)0).Equals((object)0)不同?

为什么(object)0 == (object)0和((object)0).Equals((object)0)不同?
EN

Stack Overflow用户
提问于 2013-12-18 02:44:27
回答 5查看 8.1K关注 0票数 117

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

代码语言:javascript
复制
[1]  (object)0 == (object)0 //false
[2]  ((object)0).Equals((object)0) // true

实际上,我可以完全理解1,因为.NET运行时可能会box整数并开始比较引用。但是为什么2是不同的呢?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-12-18 02:46:42

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

==用例将绑定到静态引用相等运算符。创建了2个独立的盒装int值,因此它们不是相同的引用。

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

票数 151
EN

Stack Overflow用户

发布于 2013-12-18 02:47:55

==操作符是静态的,不是虚拟的。它将运行object类定义的完全相同的代码(`object是操作数的编译时类型),该代码将执行引用比较,而不考虑任何对象的运行时类型。

Equals方法是一个虚拟实例方法。它将运行(第一个)对象的实际运行时类型中定义的代码,而不是object类中的代码。在本例中,对象是一个int,因此它将执行值比较,因为这是int类型为其Equals方法定义的值。

票数 18
EN

Stack Overflow用户

发布于 2013-12-18 02:46:45

Equals()方法是虚拟的。

因此,即使调用站点被强制转换为object,它也总是调用具体的实现。int覆盖Equals()以按值进行比较,因此您可以进行值比较。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20642202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档