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