I have the following code:
object val1 = 1;
object val2 = 1;
bool result1 = (val1 == val2);//Equals false
bool result2 = val1.Equals(val2); //Equals true
What's up with that? Is the only way to fix this to go with .Equals() method?
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With