C#System.Object.operator ==()

MrN*_*ick 10 c#

我试着试着使用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)会.

jas*_*son 7

我不确定这本书为什么会这么说; 默认==调用是非常不真实的Equals.另外,object不要超载==.==默认情况下,运算符对值类型执行值相等性比较,并为引用类型执行引用相等性比较.同样,它没有超载object(它是为了string).因此,在比较object a = 1object b = 1使用==运算符时,您正在进行引用相等比较.由于这些是盒装int的不同实例,因此它们将进行不同的比较.

对于所有被这个问题困惑的人,我建议你仔细阅读规范的§7.10,特别是§7.10.6.

有关拳击的微妙之处(或者我们为什么首先需要它)的更多信息,我建议您参考此主题的前一篇文章.