Delphi中的Generic holding Records中的等于运算符

Lio*_*ain 6 delphi record delphi-xe

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

TMyList<T> = class
private
  fCount: Cardinal;
  fItems: array of T;
public
  constructor Create(aSize: Integer);
  procedure UpdateItem(const x: T);
end;
Run Code Online (Sandbox Code Playgroud)

但我不能编译

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;
Run Code Online (Sandbox Code Playgroud)

它适用于具有此声明的类:TMyList<T : class> = class但是它不再能够保存记录.

当然,为了记录我声明class operator Equal(Left, Right : TMyRecord) : Boolean;,这MyRecord1 = MyRecord2将编译.

Dav*_*nan 8

使用=操作员永远无法工作.原因是泛型约束不够丰富,无法指定运算符的可用性.您根本无法=在通用操作数上使用运算符.

如果将操作数限制为类,则可以这样做,因为类是引用,并且编译器知道如何比较引用的相等性.基本上编译器需要知道在编译泛型类时如何生成代码.与C++或Smalltalk模板不同,使用泛型编译器不会等到实例化才能编译代码.

如果您想使用自定义比较器,那么您将需要提供明确的.我知道,这是相当令人沮丧的.如果您可以使用默认比较器,您可以使用:

TEqualityComparer<T>.Default
Run Code Online (Sandbox Code Playgroud)