Re[3]: Эквивалентность record-ов
От: _FRED_ Черногория
Дата: 18.10.23 20:02
Оценка: 53 (1)
Здравствуйте, VladD2, Вы писали:

_FR>>P.S. По-честному, если рекорд не `sealed`, хорощо б и `EqualityContract` сравнивать и учитывать в хеше:

VD>А кто-нибудь может в двух словах объяснить на фиг он вообще EqualityContract придумали?

Чтобы экземпляр наследника вдруг не смог бы быть равен экземпляру базового типа.

The EqualityContract enables the equality methods to compare the runtime type of objects when they're checking for equality.

(отсюда)

Пример:
using System;

var r = new R("A");
var x = new X("A");
Console.WriteLine($"Compare {nameof(r)} and {nameof(x)}: {r == x}"); // False

var r1 = new R1("A");
var x1 = new X1("A");
Console.WriteLine($"Compare {nameof(r1)} and {nameof(x1)}: {r1 == x1}"); // True

record R(string Name) { }
record X(string Name) : R(Name) { }

record R1(string Name) {
  public virtual bool Equals(R1? other) => other is not null && other.Name == Name;
  public override int GetHashCode() => Name?.GetHashCode() ?? 0;
}

record X1(string Name) : R1(Name) { }
Help will always be given at Hogwarts to those who ask for it.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.