如何在德尔福中将泛型数组作为开放数组参数传递?



我有一个枚举类型,我需要传递一个这种类型的数组作为参数:

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 开始就支持此语法。

最新更新