如何在 Delphi 中将通用数组作为开放数组参数传递?
How to pass generic array as open array parameter in Delphi?
我有一个枚举类型,我需要传递一个这种类型的数组作为参数:
type
TTest = (a,b,c);
procedure DoTest(stest: TArray<TTest>);
编译时
DoTest([a]);
我收到以下错误:
Error: E2010 Incompatible types: 'System.TArray' and 'Set'*
那么,如何在不创建 TArray<TTest>
类型的变量的情况下调用 DoTest
?
编译器可能会将 a
与另一个声明混淆。
像这样限定类型:
DoTest([Ttest.a]);
注:
XE7中引入了这个初始化动态数组的特性。
我假设 "how can I call DoTest without creating a variable of type TArray" 您想避免声明和初始化局部变量,即像
这样的代码
var arr: TArray<TTest>;
begin
SetLength(arr, 1);
arr[0] := a;
DoTest(arr);
为此,您可以使用数组构造函数,例如:
DoTest(TArray<TTest>.Create(a));
至少从 Delphi 2010 年开始支持此语法。
我现在没有可用的 Delphi 编译器,所以我无法验证这一点,但对我来说
procedure DoTest(stest: TArray<TTest>);
没有将 stest
声明为 open array parameter,而是一个动态数组参数。你确实想要
procedure DoTest(const stest: array of TTest);
一种方法是将参数更改为 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;
然后可以使用创建语法调用它,而无需声明变量或手动填充它。编译器将为您执行此操作:
begin
DoTest(TArray<TTest>.Create(a, c, b, a, c));
end.
输出如预期的那样:
0 2 1 0 2
我有一个枚举类型,我需要传递一个这种类型的数组作为参数:
type
TTest = (a,b,c);
procedure DoTest(stest: TArray<TTest>);
编译时
DoTest([a]);
我收到以下错误:
Error: E2010 Incompatible types: 'System.TArray' and 'Set'*
那么,如何在不创建 TArray<TTest>
类型的变量的情况下调用 DoTest
?
编译器可能会将 a
与另一个声明混淆。
像这样限定类型:
DoTest([Ttest.a]);
注:
XE7中引入了这个初始化动态数组的特性。
我假设 "how can I call DoTest without creating a variable of type TArray" 您想避免声明和初始化局部变量,即像
这样的代码var arr: TArray<TTest>;
begin
SetLength(arr, 1);
arr[0] := a;
DoTest(arr);
为此,您可以使用数组构造函数,例如:
DoTest(TArray<TTest>.Create(a));
至少从 Delphi 2010 年开始支持此语法。
我现在没有可用的 Delphi 编译器,所以我无法验证这一点,但对我来说
procedure DoTest(stest: TArray<TTest>);
没有将 stest
声明为 open array parameter,而是一个动态数组参数。你确实想要
procedure DoTest(const stest: array of TTest);
一种方法是将参数更改为 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;
然后可以使用创建语法调用它,而无需声明变量或手动填充它。编译器将为您执行此操作:
begin
DoTest(TArray<TTest>.Create(a, c, b, a, c));
end.
输出如预期的那样:
0 2 1 0 2