【问题标题】:How to pass generic array as open array parameter in Delphi?如何在 Delphi 中将泛型数组作为开放数组参数传递?
【发布时间】:2018-06-22 18:48:15
【问题描述】:

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

type
  TTest = (a,b,c);


procedure DoTest(stest: TArray<TTest>);

当我编译时

DoTest([a]);

我收到以下错误:

错误:E2010 不兼容的类型:'System.TArray' 和 'Set'*

那么,如何在不创建TArray&lt;TTest&gt; 类型的变量的情况下调用DoTest

【问题讨论】:

  • TArray&lt;Ttest&gt; 不是开放数组参数 - array of Ttest 会。
  • @StefanGlienke,是的,这显然是对如何调用此类参数的误解。
  • 你的问题很奇怪。想想看。 “我有一个接受TArray&lt;TTest&gt; 的函数。如何在不传递TArray&lt;TTest&gt; 的情况下调用它?”当然,很明显你不能这样做。更改函数以接受开放数组参数。
  • 很难调和声称不知道这个问题的标题是什么开放数组参数。你只是完全不小心输入了这些词。认真地阅读文档。不要放弃。如果您阅读文档,这会容易得多。
  • 当你说他时,你的意思是我还是你在共享一个帐户?

标签: delphi delphi-xe5


【解决方案1】:

我现在没有可用的 Delphi 编译器,所以我无法验证这一点,但对我来说

procedure DoTest(stest: TArray<TTest>);

没有将stest 声明为open array parameter,而是一个动态数组参数。你确实想要

procedure DoTest(const stest: array of TTest);

【讨论】:

【解决方案2】:

做你想做的一种方法是将参数更改为 TTest 的 open array,即

procedure DoTest(const stest: array of TTest);

但是假设您不想更改参数,并且真的希望它是TArray&lt;TTest&gt;,那么您可以简单地使用数组伪构造函数语法来调用它(在几乎所有版本的 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

【讨论】:

    【解决方案3】:

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

    像这样限定类型:

    DoTest([Ttest.a]);
    

    注意:

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

    【讨论】:

    • 我用 Delphi 2010 对此进行了测试,它给出了相同的错误 OP 帖子(编译器认为它是一个集合,而不是数组)。
    • @ain,这是 XE7 中引入的功能。
    • 好的,OP 应该指定他的 Delphi 版本以及他对“没有 var”的含义(即我的解决方案是否“创建一个 var”)
    • "如何在不创建TArray&lt;TTest&gt; 类型的变量的情况下调用DoTest?"
    • @DavidHeffernan,你如何创建TArray&lt;TTest&gt;? 类型的变量。我的答案在 XE7+ 中运行良好并初始化了一个动态数组。
    【解决方案4】:

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

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

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

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

    至少从 Delphi 2010 开始支持这种语法。

    【讨论】:

    • 如何在不创建 TTest 数组的 var 的情况下调用 DoTest
    • 嗯,我认为OP意味着没有局部变量......创建一个数组“内联”不一样?
    • 无论哪种方式,如果编译器支持 XE7 引入的初始化动态数组的方式,这将产生与我的答案相同的代码。
    • "如何在不创建TArray&lt;TTest&gt; 类型的变量的情况下调用DoTest?"
    • @ain 当术语不精确时,很难知道是什么意思。您声明变量并创建对象。您不创建变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多