如何在Delphi中将通用数组作为开放数组参数传递?

时间:2018-06-22 18:48:16

标签: delphi delphi-xe5

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

type
  TTest = (a,b,c);


procedure DoTest(stest: TArray<TTest>);

我编译时

DoTest([a]);

我收到以下错误:

  

错误:E2010不兼容的类型:“ System.TArray”和“设置” *

那么,如何在不创建类型为DoTest的变量的情况下调用TArray<TTest>

4 个答案:

答案 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)

编译器可能会将a与另一个声明混淆。

使用以下类型限定类型:

DoTest([Ttest.a]);

注意:

XE7中引入了初始化动态数组的功能。

答案 3 :(得分:0)

我假设使用“如何在不创建TArray类型的变量的情况下调用DoTest”来避免声明和初始化局部变量,即类似代码的

var arr: TArray<TTest>;
begin
  SetLength(arr, 1);
  arr[0] := a;
  DoTest(arr);

为此,您可以使用如下数组构造函数:

DoTest(TArray<TTest>.Create(a));

至少从Delphi 2010起就支持此语法。