Редактировать:
Как заметил Руди Велтуис в комментариях, в свежих версиях Delphi результат верен для равных константных строк, поскольку они совместно используют одну и ту же память и имеюттот же адрес (поэтому мое прежнее предположение о лучшем RTTI неверно).
Для сложных типов равенство по умолчанию для сравнения по-прежнему выбирается низкоуровневый компаратор, который сравнивает необработанные байты обеих записей - разные адреса для похожих строковых тел во втором случаемоего примера.
Таким надежным подходом является создание собственного компаратора для работы со сложными типами - см. третий пример ниже.
type
TRecS = record
s: string;
end;
var
rec1, rec2: TRecS;
comparerS: IEqualityComparer<TRecS>;
cmp: IEqualityComparer<TRecS>;
res: boolean;
begin
rec1.s := 'const';
rec2.s := 'const';
comparerS := TEqualityComparer<TRecS>.default;
res := comparerS.equals(rec1, rec2);
Memo1.Lines.Add(boolToStr(res));
rec1.s := IntToStr(88);
rec2.s := IntToStr(88);
res := comparerS.equals(rec1, rec2);
Memo1.Lines.Add(boolToStr(res));
cmp := TEqualityComparer<TRecS>.Construct(
function(const Left, Right: TRecS): Boolean
begin
Result := Left.S = Right.S
end,
nil);
res := cmp.equals(rec1, rec2);
Memo1.Lines.Add(boolToStr(res));
-1 //denotes true
0
-1