Co tu się dzieje?.NET: Dziwne zachowanie double.Equals() przy boksie
int zero = 0;
double x = 0;
object y = x;
Console.WriteLine(x.Equals(zero)); // True
Console.WriteLine(y.Equals(zero)); // False
Co tu się dzieje?.NET: Dziwne zachowanie double.Equals() przy boksie
int zero = 0;
double x = 0;
object y = x;
Console.WriteLine(x.Equals(zero)); // True
Console.WriteLine(y.Equals(zero)); // False
Tutaj dzwonisz dwa różne sposoby - Double.Equals(double)
i Object.Equals(object)
. W przypadku pierwszego wywołania int
jest niejawnie możliwa do przekształcenia na double
, więc dane wejściowe do metody to double
i przeprowadza kontrolę równości między dwoma double
s. Jednak dla drugiego wywołania int
jest , a nie jest rzutowany na double
, jest tylko boksowany. Jeśli przyjrzeć się metodzie Double.Equals(object)
w reflektorze, pierwsza linia jest:
if (!(obj is double))
{
return false;
}
więc to powrót fałszywe, jak wejście jest box int
, a nie box double
.
Dobry połów!