Sto riscontrando un comportamento diverso tra l'utilizzo di .Equals e == tra due delle nuove istanze di .NET 4.0 di Tuple <>. Se ho effettuato l'override uguale all'oggetto nella tupla <> e chiamo .Equals sulle tuple, verrà chiamato l'override di Equals. Se uso == sulle tuple, l'override di Equals non viene chiamato. È di progettazione e ha senso?Si prevede questo comportamento di uguaglianza Tuple C# 4.0?
MODIFICA: Da risposte e commenti posso dire che non sono stato chiaro. So che Tuple <> è un tipo di riferimento e che per i tipi di riferimento == controllerà l'identità (ReferenceEquals). Ma, dovrebbe Tuple <> override == per controllare l'uguaglianza degli oggetti che contiene? Per coerenza, probabilmente no.
Per esempio se ho un semplice oggetto
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;
}
}
e poi faccio qualcosa di simile:
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);
ottengo operatorResult = false equalsResult = true
Dovrei essere in attesa quella?
So che l'implementazione di Equals su NameAndNumber non è "corretta" ma solo codice di esempio semplificato.
Ho anche provato a implementare IEquatable, ==,! = E GetHashCode. Stessi risultati
Grazie per le risposte e i commenti. Avrei dovuto aspettarmi questo comportamento. Sto sostituendo i nostri progetti 3.5 Implementazione di tuple che abbiamo scritto noi stessi con l'implementazione .NET 4. Il nostro overdrle Tuple == per ottenere il comportamento che mi aspettavo nella domanda. Quindi sono rimasto sorpreso quando non si comportava esattamente come il nostro costume. –