【发布时间】:2013-05-31 00:09:28
【问题描述】:
假设您有一个带有重载相等运算符的记录
TSomeRecord = record
Value : String;
class operator Equal(Left, Right : TSomeRecord) : Boolean;
end;
(实现比较字符串值)。如果基于重载运算符将两个相等的记录添加到列表中,我希望Contains 方法在这两种情况下都返回true。但实际上,泛型列表似乎只是比较记录的内存内容,而不是应用重载的相等运算符。
var
List : TList <TSomeRecord>;
Record1,
Record2 : TSomeRecord;
begin
Record1.Value := 'ABC';
Record2.Value := 'ABC';
List.Add(Record1);
Assert(List.Contains(Record1));
Assert(List.Contains(Record2)); // <--- this is not true
end;
这是预期的行为吗?有什么解释吗?
【问题讨论】:
-
Equal 运算符 impl 是什么样子的?可能与stackoverflow.com/questions/8862807/list-and-contains-method有关
-
一般情况下,记录不支持
=操作符,并且无法在代码中检测到是否有特定类型支持它,因此默认实现必须对它不支持的所有类型使用简单的内存比较'没有先验知识。 -
感谢@RobKennedy,那么最好对泛型类型进行等式约束,以确保等式运算符的存在。
-
@Smasher 有很多约束条件会很好。例如,如果我们可以约束算术运算符,那么我们可以编写通用数学算法
-
是的,那只是一个白日梦:)
标签: delphi generics operator-overloading delphi-xe2 record