Điều gì đang xảy ra ở đây?.NET: Hành vi lạ của double.Equals() khi boxing
int zero = 0;
double x = 0;
object y = x;
Console.WriteLine(x.Equals(zero)); // True
Console.WriteLine(y.Equals(zero)); // False
Điều gì đang xảy ra ở đây?.NET: Hành vi lạ của double.Equals() khi boxing
int zero = 0;
double x = 0;
object y = x;
Console.WriteLine(x.Equals(zero)); // True
Console.WriteLine(y.Equals(zero)); // False
Ở đây, bạn đang gọi hai phương thức khác nhau - Double.Equals(double)
và Object.Equals(object)
. Đối với cuộc gọi đầu tiên, int
có thể chuyển đổi hoàn toàn thành double
, do đó, đầu vào cho phương thức là double
và nó thực hiện kiểm tra bình đẳng giữa hai số double
s. Tuy nhiên, đối với cuộc gọi thứ hai, số int
là không phải được truyền tới số double
, nó chỉ được đóng hộp. Nếu bạn có một cái nhìn tại các phương pháp Double.Equals(object)
trong phản xạ, dòng đầu tiên là:
if (!(obj is double))
{
return false;
}
vì vậy nó trở lại sai, vì đầu vào là một đóng hộp int
, không phải là một đóng hộp double
.
Bắt tốt!