Delphi中泛型持有记录的等于运算符

6

我有一个泛型列表,我想要放入一些记录或一些类

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可以编译通过。

1个回答

8
这个操作无法使用=运算符实现。原因是通用约束不足以指定运算符的可用性。你不能在通用操作数上使用=运算符。
如果将操作数限制为类,则可以这样做,因为类是引用类型,编译器知道如何比较引用的相等性。基本上,编译器在编译通用类时需要知道如何生成代码。与C++或Smalltalk模板不同,使用通用类型时,编译器不会等到实例化才编译代码。
如果您想使用自定义比较器,则需要显式提供它。我知道这很令人沮丧。如果您可以使用默认比较器,则可以使用:
TEqualityComparer<T>.Default

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接