.NET: Странное поведение double.Equals () при боксировании - PullRequest
5 голосов
/ 06 мая 2010

Что здесь происходит?

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

Console.WriteLine(x.Equals(zero)); // True
Console.WriteLine(y.Equals(zero)); // False

1 Ответ

10 голосов
/ 06 мая 2010

Здесь вы вызываете два разных метода - Double.Equals(double) и Object.Equals(object). Для первого вызова int неявно преобразуется в double, поэтому входные данные для метода являются double, и он проверяет равенство между двумя double с. Однако для второго вызова int - это , а не , который преобразуется в double, он только в штучной упаковке. Если вы посмотрите на метод Double.Equals(object) в отражателе, первая строка:

if (!(obj is double))
{
    return false;
}

так что он возвращает false, поскольку входные данные в штучной упаковке int, а не в штучной упаковке double.

Хороший улов!

...