我正在写一种数组包装器,将记录用作容器,并向其中包括一些“类”函数。 我还希望可以像普通数组一样为它分配一个数组,所以我实现了一个隐式类运算符:
type
TArrayWrapper = record
class operator Implicit(AArray: array of TObject): TArrayWrapper; overload;
Items: TArray<TObject>;
procedure Add(AItem: TObject);
...
end;
所以我可以做类似的事情:
procedure DoSomething;
var
myArray: TArrayWrapper;
begin
myArray := [Obj1, Obj2, Obj3];
...
end;
当我尝试将Integer数组传递给具有TArrayWrapper作为参数的方法时,会出现问题:
procedure DoSomethingElse(AArrayWrapper: TArrayWrapper);
begin
...
end;
procedure DoSomething;
var
myArray: TArrayWrapper;
begin
myArray := [Obj1, Obj2, Obj3];
DoSomethingElse(myArray); <--- Works!!!!
DoSomethingElse([Obj1, Obj2, Obj3]); <--- Error E2001: Ordinal type required -> It is considering it like a set, not as an array
end;
会发生什么?
谢谢。
答案 0 :(得分:4)
当记录/类用作参数时,编译器尚未为类运算符在动态数组上实现类似于字符串的操作。
据我所知,目前还没有QP报告。 现在有,请参阅下文。
在以下评论中找到了类似的示例:Dynamic Arrays in Delphi XE7
解决方法:
DoSomethingElse(TArray<TObject>.Create(Obj1, Obj2, Obj3));
或如@Stefan所建议,以避免不必要的分配。在记录中添加一个构造函数:
type
TArrayWrapper = record
class operator Implicit(AArray: array of TObject): TArrayWrapper;
constructor Init( const AArray: array of TObject);
end;
DoSomethingElse(TArrayWrapper.Init([obj1,obj2,obj3]));
报告为:RSP-24610 Class operators do not accept dynamic arrays passed with brackets