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

时间:2019-05-30 10:36:54

标签: arrays delphi record

我正在写一种数组包装器,将记录用作容器,并向其中包括一些“类”函数。 我还希望可以像普通数组一样为它分配一个数组,所以我实现了一个隐式类运算符:

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;

会发生什么?

谢谢。

1 个答案:

答案 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