Равен против == при сравнении двойного с нулем - PullRequest
1 голос
/ 19 августа 2011

Я пытаюсь сравнить двойное значение, чтобы увидеть, равно ли оно нулю. Будет работать следующее:

Assert.IsTrue(0d==0);

Однако это не удастся:

Assert.IsTrue(Equals(0d,0));

Я думаю, что второй аргумент (0) рассматривается как целое число. Однако я не понимаю, почему Equals (0d, 0) оценивается как ложное, тогда как 0d == 0 - правда. Это не может быть округление, потому что оба значения непосредственно вводятся в виде нулей.

Ответы [ 3 ]

4 голосов
/ 19 августа 2011

Интуитивно это так просто, как «они не двойники».

Однако, если вы хотите углубиться в подробности, Object.Equals (статический метод, который вы вызываете во втором примере) это:

[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
public static bool Equals(object objA, object objB)
{
    return ((objA == objB) || (((objA != null) && (objB != null)) && objA.Equals(objB)));
}

2 ссылки не равны, как и null, поэтому Double.Equals вызывается виртуально:

public override bool Equals(object obj)
{
    if (!(obj is double))
    {
        return false;
    }
    double d = (double) obj;
    return ((d == this) || (IsNaN(d) && IsNaN(this)));
}

Аргумент не является double, поэтому он возвращает false.

Это взято из mscorlib для 64-разрядной версии .NET 4.0.

2 голосов
/ 19 августа 2011

Я полагаю, что Equals (0d, 0) также может проводить сравнение типов.0d технически не равен 0, потому что они не одного типа.

Редактировать:

http://msdn.microsoft.com/en-us/library/bsc2ak47.aspx

Это тот случай, который кажется.

MSDN: true, если указанный объект равен текущему объекту;в противном случае - false.

В качестве альтернативы вы можете использовать что-то вроде Convert.ToDouble (0), и оно должно работать.Сейчас я не нахожусь рядом с компилятором C #, поэтому не могу проверить, правильно ли это.

0 голосов
/ 19 августа 2011

В первой строке оператор == приводит значения к общему типу, а во второй вызывается метод Double.Equals , который перед сравнением выполняет проверку типа, котораявозвращает false, поскольку одно значение равно double , а другое - integer .

...