我有一个枚举类型,我需要将此类型的数组作为参数传递:
type
TTest = (a,b,c);
procedure DoTest(stest: TArray<TTest>);
我编译时
DoTest([a]);
我收到以下错误:
错误:E2010不兼容的类型:“ System.TArray”和“设置” *
那么,如何在不创建类型为DoTest
的变量的情况下调用TArray<TTest>
?
答案 0 :(得分:4)
我现在没有可用的Delphi编译器,所以我无法验证,但是对我来说
procedure DoTest(stest: TArray<TTest>);
不会将stest
声明为open array parameter,而是将其声明为动态数组参数。你确实想要
procedure DoTest(const stest: array of TTest);
答案 1 :(得分:3)
一种执行所需操作的方法是将参数更改为TTest的open array,即
procedure DoTest(const stest: array of TTest);
但是假设您不想更改参数,而确实希望它是TArray<TTest>
,那么您可以简单地使用数组伪构造函数语法来调用它(在几乎所有的Delphi版本中,除了很老的)。假设您有类似的内容:
type
TTest = (a, b, c);
procedure DoTest(const stest: TArray<TTest>);
// simple demo implementation
var
I: Integer;
begin
for I := Low(stest) to High(stest) do
Write(Integer(stest[I]), ' ');
Writeln;
end;
然后可以使用Create语法调用它,而不必声明变量或手动填充它。编译器将为您执行此操作:
begin
DoTest(TArray<TTest>.Create(a, c, b, a, c));
end.
输出符合预期:
0 2 1 0 2
答案 2 :(得分:1)
答案 3 :(得分:0)
我假设使用“如何在不创建TArray类型的变量的情况下调用DoTest”来避免声明和初始化局部变量,即类似代码的
var arr: TArray<TTest>;
begin
SetLength(arr, 1);
arr[0] := a;
DoTest(arr);
为此,您可以使用如下数组构造函数:
DoTest(TArray<TTest>.Create(a));
至少从Delphi 2010起就支持此语法。