为什么0L在投射到物体时不等于0?

时间:2015-01-08 21:44:36

标签: c#

我不认为我理解为什么第一个语句评估为true而最后一个语句评估为false,但这是漫长的一天。

有人可以解释一下吗?

0L.Equals(0) // true
((object)0L).Equals(0L) // true
((object)0L).Equals(0) // false

3 个答案:

答案 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两个片段,每个片段分别具有longint,因此两者都被装箱。 object.Equals实现还检查参数的类型,并认为不同类型的任何对象不相等。这两个片段中的第一个通过了检查,此时它继续检查值,发现它们相等。第二个代码段未通过检查,结果为false