我不认为我理解为什么第一个语句评估为true
而最后一个语句评估为false
,但这是漫长的一天。
有人可以解释一下吗?
0L.Equals(0) // true
((object)0L).Equals(0L) // true
((object)0L).Equals(0) // false
答案 0 :(得分:13)
Object.Equals
首先比较类型。在这种情况下两者都不同。
MSDN:
如果当前实例是值类型,则为Equals(Object)方法 测试价值平等。价值平等意味着以下几点:两者 对象属于同一类型。如下例所示,是一个字节 值为12的对象不等于具有的Int32对象 值为12,因为这两个对象具有不同的运行时类型。
答案 1 :(得分:0)
((object)0L).Equals(0)
这里你要比较一种类型的对象和一种int类型(不要在int上引用它,它可能是另一种数字类型)
类型不同。
答案 2 :(得分:0)
0L.Equals(0) // true
这解析为long.Equals
方法,该方法接受long
作为参数。为int
的参数提供的实际表达式。 int
隐式转换为long
,因此long
0
会被传入,等于另一个值。
((object)0L).Equals(0L) // true
((object)0L).Equals(0) // false
在此处装箱long
可防止使用long.Equals
重载,并仅保留object.Equals
重载,该重载接受object
参数。由于参数为object
两个片段,每个片段分别具有long
和int
,因此两者都被装箱。 object.Equals
实现还检查参数的类型,并认为不同类型的任何对象不相等。这两个片段中的第一个通过了检查,此时它继续检查值,发现它们相等。第二个代码段未通过检查,结果为false
。