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
我正在编写一种数组包装器,使用记录作为容器,并向其中包含一些 "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