Re[5]: Эквивалентность record-ов
От: _FRED_ Черногория
Дата: 19.10.23 10:10
Оценка:
Здравствуйте, 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`, то тем самым ты заявил, что принимаешь все эти риски. Автоматически же компилятору поддерживать подобное (особенно в случае различных иерархий типов) в согласованном состоянии будет сложно.
Help will always be given at Hogwarts to those who ask for it.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.