我有一个泛型列表,我想在其中放置一些记录或一些类
TMyList<T> = class
private
fCount: Cardinal;
fItems: array of T;
public
constructor Create(aSize: Integer);
procedure UpdateItem(const x: T);
end;
但是我无法编译
procedure TMyList<T>.UpdateItem(const x: T);
var
I: integer;
begin
for I := 0 to fCount - 1 do
if fItems[I] = x then begin // <- error E2015
//do update
break;
end;
end;
它适用于具有以下声明的类:TMyList<T : class> = class
,但它就不能再保存记录了。
当然,为了记录,我声明 class operator Equal(Left, Right : TMyRecord) : Boolean;
这样MyRecord1 = MyRecord2
将编译。
最佳答案
使用 =
运算符永远无法使其工作。原因是通用约束不够丰富,无法指定运算符的可用性。您根本无法在通用操作数上使用 =
运算符。
如果将操作数限制为类,则可以这样做,因为类是引用,并且编译器知道如何比较引用是否相等。基本上,编译器在编译泛型类时需要知道如何生成代码。与 C++ 或 Smalltalk 模板不同,使用泛型,编译器不会等到实例化才编译代码。
如果您想使用自定义比较器,那么您需要明确提供该比较器。我知道这相当令人沮丧。如果您可以使用默认比较器,您可以使用:
TEqualityComparer<T>.Default
关于delphi - Delphi 中通用持有记录的等于运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22498556/