我有一个枚举类型,我需要传递一个这种类型的数组作为参数:
type
TTest = (a,b,c);
procedure DoTest(stest: TArray<TTest>);
当我编译时
DoTest([a]);
我收到以下错误:
错误: E2010 不兼容的类型:"系统.TArray"和"设置"*
那么,如何在不创建TArray<TTest>
类型的变量的情况下调用DoTest
?
我现在没有可用的 Delphi 编译器,所以我无法验证这一点,但对我来说
procedure DoTest(stest: TArray<TTest>);
不将stest
声明为开放数组参数,而是声明为动态数组参数。你确实想要
procedure DoTest(const stest: array of TTest);
执行所需操作的一种方法是将参数更改为 TTest 的开放数组,即
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
编译器可能会将a
与另一个声明混淆。
按如下方式限定类型:
DoTest([Ttest.a]);
注意:
初始化动态数组的这个特性是在 XE7 中引入的。
我假设使用"如何在不创建 TArray 类型变量的情况下调用 DoTest",您希望避免声明和初始化局部变量,即像这样的代码
var arr: TArray<TTest>;
begin
SetLength(arr, 1);
arr[0] := a;
DoTest(arr);
为此,您可以使用数组构造函数,如下所示:
DoTest(TArray<TTest>.Create(a));
至少从 Delphi 2010 开始就支持此语法。