El operador ==
es estático, no virtual, por lo que el comportamiento está determinado por el tipo estático y no por el tipo de tiempo de ejecución. La implementación predeterminada para ==
en objetos del tipo de referencia es para comparar las referencias (aunque los tipos pueden implementar un comportamiento diferente, por ejemplo string
). Tiene dos objetos diferentes y no tienen la misma referencia, por lo que ==
devuelve falso.
La solución, como usted señala, es usar Equals. Equals es un método virtual. Como value1
tiene el tipo de tiempo de ejecución Int32
, termina llamando al Int32.Equals. De .NET reflector se puede ver que la puesta en práctica de esto es la siguiente:
public override bool Equals(object obj)
{
return ((obj is int) && (this == ((int) obj)));
}
En otras palabras, se comprueba si el argumento es de tipo int
, y si es así se proyecta y utiliza el ==
que se define para int
. Esto compara los valores de los enteros.
¿Es la única forma de arreglar esto para ir con el método .Equals()?
Una alternativa es echar sus objetos a int
y luego usar ==
, al igual que la implementación de Int32.Equals
hace.
Dicen que son iguales pero hay dos casos diferentes –
Dude, == y .Equals hacen 2 cosas diferentes. == operador comprueba si val1 y val2 ocupan el mismo espacio de memoria (referencia). .Equals comprueba la igualdad de contenido. – Icemanind
También puede usar el método estático 'object.Equals (object, object)', que primero intenta comparar los objetos usando el operador '==' y luego prueba el método 'object.Equals (object)' si ambos parámetros son no nulo. La razón por la que sugiero es para que no tenga que verificar null antes de llamar a 'object.Equals (object, object)', mientras que si llama a 'object.Equals (object)'. –