Интуитивно это так просто, как «они не двойники».
Однако, если вы хотите углубиться в подробности, 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.