Two .NET objects that are equal don't say they are

后端 未结 7 1221
故里飘歌
故里飘歌 2020-12-06 05:09

I have the following code:

object val1 = 1;
object val2 = 1;

bool result1 = (val1 == val2);//Equals false
bool result2 = val1.Equals(val2); //Equals true


        
相关标签:
7条回答
  • 2020-12-06 06:11

    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.

    0 讨论(0)
提交回复
热议问题