Я вижу различное поведение между использованием .Equals и == между двумя .NET Tuple < > экземплярами .NET 4.0. Если бы я переопределил Equals на объекте в Tuple < > и вызовет .Equals в кортежах, будет вызван переопределение Equals. Если я использую == в Tuples, переопределение Equals не вызывается. Это по дизайну и имеет смысл?
EDIT: Из ответов и комментариев я могу сказать, что я не понимаю. Я знаю, что Tuple < > является ссылочным типом и что для ссылочных типов == проверяет идентификатор (ReferenceEquals). Но должен ли Tuple < > override == проверять равенство объектов, которые он содержит? Для согласованности, вероятно, нет.
Например, если у меня есть простой объект
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;
}
}
а затем я делаю что-то вроде этого:
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);
Я получаю operatorResult = false equalsResult = true
Должен ли я ожидать этого?
Я знаю, что реализация Equals on NameAndNumber не является "правильной", это просто упрощенный пример кода.
Я также попытался реализовать IEquatable, ==,!= и GetHashCode. Те же результаты.