Delphi - 隐式类型转换运算符不适用于方法参数

Delphi - Implicit typecast operator not working for method parameters

我正在编写一种数组包装器,使用记录作为容器,并向其中包含一些 "class-like" 函数。 我还希望可以为它分配一个数组,就像普通数组一样,所以我实现了一个隐式 class 运算符:

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;

可能发生了什么?

提前致谢。

当 record/class 用作参数时,编译器没有为 class 运算符在动态数组上实现类似字符串的操作。

据我所知,目前还没有 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