Delphi中的Generic holding Records中的等于运算符
发布时间:2020-12-15 04:08:11 所属栏目:大数据 来源:网络整理
导读:我有一个泛型列表,我想在其中放入一些记录或一些类 TMyListT = classprivate fCount: Cardinal; fItems: array of T;public constructor Create(aSize: Integer); procedure UpdateItem(const x: T);end; 但我不能编译 procedure TMyListT.UpdateItem(const
我有一个泛型列表,我想在其中放入一些记录或一些类
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,但它不能再保存记录了. 当然,对于记录我声明类运算符Equal(Left,Right:TMyRecord):Boolean;这样MyRecord1 = MyRecord2就可以编译了. 解决方法
使用=运算符永远不能使其工作.原因是泛型约束不够丰富,无法指定运算符的可用性.你根本不能在泛型操作数上使用=运算符.
如果将操作数限制为类,则可以这样做,因为类是引用,并且编译器知道如何比较引用的相等性.基本上编译器需要知道在编译泛型类时如何生成代码.与C或Smalltalk模板不同,对于泛型,编译器不会等到实例化以编译代码. 如果您想使用自定义比较器,那么您将需要提供明确的.我知道,这是相当令人沮丧的.如果您可以使用默认比较器,您可以使用: TEqualityComparer<T>.Default (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |