.NET:装箱时double.Equals()的奇怪行为

Vil*_*lx- 5 .net comparison boxing

这里发生了什么?

int zero = 0;
double x = 0;
object y = x;

Console.WriteLine(x.Equals(zero)); // True
Console.WriteLine(y.Equals(zero)); // False
Run Code Online (Sandbox Code Playgroud)

the*_*oop 10

在这里,你要调用两种不同的方法 - Double.Equals(double)Object.Equals(object).对于第一个调用,int可以隐式转换为double,因此方法的输入是a double,它在两个doubles 之间进行相等性检查.但是,对于第二个调用,int不会被转换为a double,它只是被装箱.如果您看一下Double.Equals(object)反射器中的方法,第一行是:

if (!(obj is double))
{
    return false;
}
Run Code Online (Sandbox Code Playgroud)

所以它返回false,因为输入是盒装的int,而不是盒装的double.

接得好!