Me encontré con esta situación hoy. Tengo un objeto que estoy probando para la igualdad; el método Create() devuelve una implementación de subclase de MyObject.¿Cuándo puede a == b ser falso y a.Equals (b) verdadero?
MyObject a = MyObject.Create();
MyObject b = MyObject.Create();
a == b; // is false
a.Equals(b); // is true
Nota también tengo Iguales sobre-montado() en la implementación subclase, que hace una comprobación muy básico para ver si el objeto pasado-in es nula y es del tipo de la subclase. Si se cumplen ambas condiciones, los objetos se consideran iguales.
La otra cosa un poco extraña es que mi banco de pruebas unidad hace algunas pruebas similares a
Assert.AreEqual(MyObject.Create(), MyObject.Create()); // Green bar
y se observa el resultado esperado. Por lo tanto, supongo que NUnit usa a.Equals (b) debajo de las coberturas, en lugar de a == b como lo había supuesto.
Nota al pie: Programa en una mezcla de .NET y Java, por lo que podría estar mezclando mis expectativas/suposiciones aquí. Sin embargo, pensé que a == b funcionaba más uniformemente en .NET que en Java, donde a menudo tienes que usar equals() para probar la igualdad.
ACTUALIZACIÓN Aquí está la aplicación de equals(), como solicitada:
public override bool Equals(object obj) {
return obj != null && obj is MyObjectSubclass;
}
¿Podríamos ver su implementación de los .Equals() anular – msarchet
? Publique el código para la función Equals anulada. – AxelEckenberger
cuando se anula uno pero no ambos, por supuesto :) – RCIX