Estoy viendo un comportamiento diferente entre usar .Equals y == entre dos de las nuevas instancias Tuple <> .NET 4.0. Si he reemplazado Equals en el objeto en el Tuple <> y llamo .Equals en las Tuplas, se invocará la anulación de Equals. Si utilizo == en las Tuplas, no se llama a la anulación de Equals. ¿Es eso por diseño y tiene sentido?¿Se espera que este sea el comportamiento de igualdad de tuplas de C# 4.0?
EDIT: De las respuestas y los comentarios puedo decir que no estoy siendo claro. Sé que Tuple <> es un tipo de referencia y que para los tipos de referencia == comprobará la identidad (ReferenceEquals). Pero, ¿debería Tuple <> anular == para verificar la igualdad de los objetos que contiene? Por consistencia, probablemente no.
Por ejemplo si tengo un objeto simple
public class NameAndNumber
{
public int Number { get; set; }
public string Name { get; set; }
public override bool Equals(object obj)
{
if (obj is NameAndNumber)
{
NameAndNumber other = (NameAndNumber)obj;
return Number == other.Number && Name == other.Name;
}
return false;
}
}
y luego hago algo como esto:
Tuple<NameAndNumber, NameAndNumber> left = new Tuple<NameAndNumber, NameAndNumber>(
new NameAndNumber { Name = "one", Number = 1 },
new NameAndNumber { Name = "two", Number = 2 });
Tuple<NameAndNumber, NameAndNumber> right = new Tuple<NameAndNumber, NameAndNumber>(
new NameAndNumber { Name = "one", Number = 1 },
new NameAndNumber { Name = "two", Number = 2 });
bool operatorResult = left == right;
bool equalsResult = left.Equals(right);
Console.Out.WriteLine("operatorResult = {0} equalsResult = {1}",
operatorResult, equalsResult);
consigo operatorResult = false equalsResult = true
¿Debo estar esperando ¿ese?
Sé que la implementación de Equals en NameAndNumber no es "correcta", simplemente se trata de un código de ejemplo simplificado.
También he intentado implementar IEquatable, ==,! = Y GetHashCode. Mismos resultados
Gracias por las respuestas y comentarios. Debería haber esperado este comportamiento. Estoy reemplazando nuestros proyectos 3.5 Implementación de Tuple que escribimos nosotros mismos con la implementación de .NET 4. Nuestra Tupla se anuló == para obtener el comportamiento que esperaba en la pregunta. Así que me sorprendió cuando no se comportó exactamente como nuestro personalizado. –