Ich sehe ein anderes Verhalten zwischen der Verwendung von .Equals und == zwischen zwei der neuen .NET 4.0 Tuple <> Instanzen. Wenn ich im Tuple <> Equals für das Objekt überschrieben habe und .Equals für die Tuples aufrufen, wird die Override von Equals aufgerufen. Wenn ich == auf den Tupeln verwende, wird die Überschreibung von Equals nicht aufgerufen. Ist das von Entwurf und macht es Sinn?Ist dieses erwartete C# 4.0 Tuple-Gleichheitsverhalten?
EDIT: Von Antworten und Kommentare kann ich sagen, ich bin nicht klar. Ich weiß, Tupel <> ist ein Referenztyp und das für Referenztypen == wird Identität (ReferenceEquals) überprüfen. Aber sollte Tupel <> override == die Gleichheit der enthaltenen Objekte überprüfen? Aus Konsistenzgründen wahrscheinlich nicht.
Zum Beispiel, wenn ich ein einfaches Objekt
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;
}
}
haben und dann so etwas wie dies tue ich:
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);
I operatorResult = false equalsResult = true
Sollte ich erwartet werden erhalten Das?
Ich weiß, die Implementierung von Equals auf NameAndNumber ist nicht "richtig", es ist nur vereinfachter Beispielcode.
Ich habe auch versucht, IEquatable, ==,! =, Und GetHashCode zu implementieren. Gleiche Ergebnisse.
Danke für die Antworten und Kommentare. Ich hätte dieses Verhalten erwarten sollen. Ich ersetze unsere Projekte 3.5 Tuple-Implementierung haben wir uns mit der .NET 4-Implementierung geschrieben. Unser Tupel überschreibt ==, um das erwartete Verhalten in der Frage zu erhalten. So war ich überrascht, als es sich nicht genau wie unser Gewohntes verhielt. –