delphi - Delphi 中通用持有记录的等于运算符

标签 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;

但是我无法编译

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/

相关文章:

ios - 在 iOS 设备上部署文件 delphi xe

delphi - 强制应用程序在 OnCreate 过程中显示任务栏图标

delphi - 使用 Hudson 构建时为 "Required package rtl not found"

delphi - “元素数(256)与声明(65536)不同”从D2007迁移到XE8

SQL Server 返回字段更改的行

java - 将从文件中读取的数据放入记录中

database - 从 mongodb 集合中获取最后一条记录

delphi - FastMM 是否只报告内存泄漏和/或内存分配?

delphi - 类里面每一项的重复程序

delphi - Delphi中截取串口数据