Widzę inne zachowanie między używaniem .Equals i == między dwoma nowymi instancjami .NET 4.0 Tuple <>. Jeśli nadpisałem Equals na obiekcie w kodzie Tuple <> i wywołałem. Wygrane w Krotkach zostanie wywołane zastąpienie równych. Jeśli użyję == na Tuplach, nie zostanie wywołane zastąpienie równań. Czy jest to zgodne z projektem i ma sens?Czy to jest oczekiwane zachowanie równości w języku C# 4.0?
EDYCJA: Z odpowiedzi i komentarzy mogę powiedzieć, że nie jestem czysty. Wiem, że Tuple <> jest typem referencyjnym, a dla typów odniesienia == sprawdza tożsamość (ReferenceEquals). Ale czy powinien Tuple <> przesłonić ==, aby sprawdzić równość obiektów, które zawiera? Dla spójności prawdopodobnie nie.
Na przykład jeśli mam prosty obiekt
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;
}
}
a następnie zrobić coś takiego:
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);
uzyskać operatorResult = false equalsResult = true
powinienem oczekiwać że?
Wiem, że implementacja równań na NameAndNumber nie jest "właściwa", to tylko uproszczony przykładowy kod.
Próbowałem również wdrażanie IEquatable, ==,! = I GetHashCode. Takie same wyniki.
Dzięki za odpowiedzi i komentarze. Powinienem był się tego spodziewać. Zastępuję nasze projekty 3.5 Implementacja Tuple napisaliśmy sami z implementacją .NET 4. Nasz Tuple przejął ==, aby uzyskać zachowanie, którego oczekiwałem w pytaniu. Byłem zaskoczony, kiedy nie zachowywał się dokładnie tak, jak nasz niestandardowy. –