.NET:装箱时 double.Equals() 的奇怪行为
这是怎么回事?
int zero = 0;
double x = 0;
object y = x;
Console.WriteLine(x.Equals(zero)); // True
Console.WriteLine(y.Equals(zero)); // False
What's going on here?
int zero = 0;
double x = 0;
object y = x;
Console.WriteLine(x.Equals(zero)); // True
Console.WriteLine(y.Equals(zero)); // False
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
在这里,您调用了两个不同的方法 -
Double.Equals(double)
和Object.Equals(object)
。对于第一次调用,int
可以隐式转换为double
,因此该方法的输入是double
,并且它会在两个 double 。然而,对于第二次调用,int
没有被转换为double
,它只是被装箱了。如果您查看反射器中的 Double.Equals(object) 方法,第一行是:因此它返回 false,因为输入是装箱的 int,而不是一个盒装的
double
。好捕获!
Here, you're calling two different methods -
Double.Equals(double)
andObject.Equals(object)
. For the first call,int
is implicitly convertable todouble
, so the input to the method is adouble
and it does an equality check between the twodouble
s. However, for the second call, theint
is not being cast to adouble
, it's only being boxed. If you have a look at theDouble.Equals(object)
method in reflector, the first line is:so it's returning false, as the input is a boxed
int
, not a boxeddouble
.Good catch!