The operator ==
is static, not virtual, so the behaviour is determined by the static type and not the runtime type. The default implementation for ==
on objects of reference type is to compare the references (although types can implement a different behaviour, for example string
). You have two different objects and they don't have the same reference so ==
returns false.
The solution, as you point out, is to use Equals. Equals is a virtual method. Since value1
has runtime type Int32
you end up calling Int32.Equals. From .NET Reflector you can see that the implementation of this is as follows:
public override bool Equals(object obj)
{
return ((obj is int) && (this == ((int) obj)));
}
In other words, it checks if the argument is of type int
, and if so casts it and uses the ==
that is defined for int
. This compares the values of the integers.
Is the only way to fix this to go with .Equals() method?
An alternative is to cast your objects to int
and then use ==
, just as the implementation of Int32.Equals
does.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…