为什么 0L 在强制转换为对象时不等于 0

本文关键字:对象 不等于 转换 0L 为什么 | 更新日期: 2023-09-27 18:36:45

我想我不明白为什么第一个语句的计算结果为true,最后一个语句的计算结果为false,但这已经是漫长的一天了。

有人可以解释一下吗?

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

为什么 0L 在强制转换为对象时不等于 0

如果对象是值类型,Object.Equals首先比较类型。在这种情况下,两者都是不同的。

MSDN:

如果当前实例是值类型,则 Equals(Object) 方法。 测试值相等性。值相等意味着以下内容:两者 对象属于同一类型。如以下示例所示,字节 值为 12 的对象不等于具有 值为 12,因为这两个对象具有不同的运行时类型。

((object)0L).Equals(0)

在这里,您将一种对象类型与一种 int 类型进行比较(不要在 int 上引用我,它可能是另一种数字类型)

类型不同。

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参数的object.Equals重载。 由于参数object两个代码段,每个代码段分别具有longint,因此两者都被框箱。 object.Equals 实现还会检查参数的类型,并将不同类型的任何对象视为不相等。 这两个代码段中的第一个通过检查,此时它继续检查值,发现它们相等。 第二个代码段未通过检查,导致false