Недавно представленные типы записей позволяют переопределить EqualityContract
для типа, что позволяет создать ситуацию, когда два объекта равны, но имеют разные хэш-коды, что противоречит рекомендации по GetHashCode
переопределению:
Если вы переопределите метод GetHashCode, вы также должны переопределить Equals, и наоборот. Если ваш переопределенный метод Equals возвращает true, когда два объекта проверяются на равенство, ваш переопределенный метод GetHashCode должен возвращать одно и то же значение для двух объектов.
public record Base(string Foo);
public record Child(string Foo, string Bar) : Base(Foo)
{
protected override Type EqualityContract => typeof(Base);
}
var b = new Base("Foo");
var c = new Child("Foo", "Bar");
Console.WriteLine(b == c); // True
Console.WriteLine(b.GetHashCode() == c.GetHashCode()); // False
При удалении лишнего свойства из Child
GetHashCode
и Equals
совпадают.
Очевидно, это можно исправить, переопределив GetHashCode
, но мне интересно, почему переопределение EqualityContract
не приводит автоматически к GetHashCode
возвращаемому значению, совпадающему с реализацией Equals
? Или есть другой способ справиться с этим, кроме ручного GetHashCode
переопределения.