Re: Эквивалентность record-ов
От: _FRED_ Черногория
Дата: 17.10.23 15:08
Оценка: 199 (6)
Здравствуйте, VladD2, Вы писали:

VD>Что-то прямо сижу и тихо охрениваю.

VD>В record нельзя добавить собственную реализацию эквивалентности (переопределит Equals) и при это они не умеют реализовывать эквивалентность для записей со списками.

С событиями тоже здорово вышло, мало кто ожидал, что они станут и их сравнивать:
using System;

var r1 = new R("R");
var r2 = new R("R");
Console.WriteLine($"Compare {nameof(r1)} and {nameof(r2)} before subscription: {r1 == r2}");

r1.Event += delegate { };
Console.WriteLine($"Compare {nameof(r1)} and {nameof(r2)} after subscription: {r1 == r2}");

record R(string Name) {
  public event EventHandler? Event;
}


P.S. По-честному, если рекорд не `sealed`, хорощо б и `EqualityContract` сравнивать и учитывать в хеше:
record R(string Name) {
  public event EventHandler? Event;
    
  public virtual bool Equals(R? other) => other != null && other.EqualityContract == EqualityContract && other.Name == Name;
  public override int GetHashCode() => (EqualityContract, Name).GetHashCode();
}
Help will always be given at Hogwarts to those who ask for it.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.