我试着试着使用System.Object.operator ==().
我的有效C#书和这里的页面(http://www.srtsolutions.com/just-what-is-the-default-equals-behavior-in-c-how-does-it-relate-to-gethashcode) ,说:
"System.Object.operator ==()将调用a.Equals(b)来确定a和b是否相等".
所以用我的代码:
object a = 1;
object b = 1;
if(object.Equals(a, b))
{
// Will get here because it calls Int32.Equals(). I understand this.
}
if(a == b)
{
// I expected it to get here, but it doesn't.
}
Run Code Online (Sandbox Code Playgroud)
我期望(a == b)调用Int32的覆盖Equals并以与static objet.Equals()相同的方式比较值.我错过了什么?
编辑:我或许应该补充一点,我可以看到(a == b)正在测试 - 它正在测试参考相等性.我被这本书抛出,似乎暗示它将在内部工作,就像静态对象一样.Equals(obect,object)会.
我不确定这本书为什么会这么说; 默认==调用是非常不真实的Equals.另外,object不要超载==.==默认情况下,运算符对值类型执行值相等性比较,并为引用类型执行引用相等性比较.同样,它没有超载object(它是为了string).因此,在比较object a = 1和object b = 1使用==运算符时,您正在进行引用相等比较.由于这些是盒装int的不同实例,因此它们将进行不同的比较.
对于所有被这个问题困惑的人,我建议你仔细阅读规范的§7.10,特别是§7.10.6.
有关拳击的微妙之处(或者我们为什么首先需要它)的更多信息,我建议您参考此主题的前一篇文章.