Здравствуйте, VladD2, Вы писали:
_FR>>Чтобы экземпляр наследника вдруг не смог бы быть равен экземпляру базового типа.
VD>А чем им для этого GetType() не подошел?
Видимо тем, что `EqualityContract` можно объявить и/или override-нуть
явно:
using System;
var r = new R("A");
var x = new X("A");
Console.WriteLine($"Compare {nameof(r)} and {nameof(x)}: {r == x}"); // True
record R(string Name) { }
record X(string Name) : R(Name) {
protected override Type EqualityContract => typeof(R);
}
VD>Да и для структурной эквивалентности (что и должна обеспечиваться для записей) не нужно совпадение типов. Достаточно совпадения полей и их значений. Так что это должно быть как опция.
В случае, когда мы допускаем, что экземпляр `record A { }` может быть "эквивалентен" экземпляру `record B : A { }` или даже `record C { }`, мне кажется, всё сильно усложнится. Как минимум, как-то вручную придётся беспокоиться о том, что `a.Equals(b) == b.Equals(a)` и `a.GetHashCode() == b.GetHashCode()` где `a` и `b` экземпляры различных типов.
Когда же ты явно переопределил `EqualityContract`, то тем самым ты заявил, что принимаешь все эти риски. Автоматически же компилятору поддерживать подобное (особенно в случае различных иерархий типов) в согласованном состоянии будет сложно.