如何在 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