【问题标题】:Assign a dynamic array type to a TArray<T> variable将动态数组类型分配给 TArray<T> 变量
【发布时间】:2020-02-21 08:02:35
【问题描述】:

我正在尝试将动态数组类型分配给 TArray&lt;string&gt; 变量

type
  TMyStringArray = array of string;

function Test() : TMyStringArray;
begin
  ...
end;

...

var
  MyArray : TArray<string>;
begin
  MyArray := Test();
end;

在编译时,Delphi 说:

[dcc32 错误] Unit1.pas(39): E2010 不兼容的类型: 'System.TArray' 和 'TMyStringArray'

【问题讨论】:

  • 这个问题在“数组类型和赋值”部分的documentation 中有介绍:“数组只有在相同类型时才是赋值兼容的>." TMyStringArrayTArray&lt;string&gt; 不是同一类型。
  • 为了完整起见,这里应该已经指出TArray&lt;string&gt;一个动态的字符串数组;它被定义为array of string

标签: arrays delphi delphi-xe7


【解决方案1】:

我只是通过使用类型转换来做到这一点,它似乎工作。

我很高兴知道这样做会遇到一些问题

type
  TMyStringArray = array of string;

function Test() : TMyStringArray;
begin
  SetLength(Result, 2);
  Result[0] := 'Hello';
  Result[1] := 'World';
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  MyArray : TArray<string>;
  i : integer;
begin
  MyArray := TArray<string>(Test());

  i := 0;
  while(i < Length(MyArray)) do
  begin
    ShowMessage(MyArray[i]);
    Inc(i);
  end;
end;

【讨论】:

  • 是的,这是正确的。 TArray&lt;string&gt; 被定义为array of string,所以它 一个动态的字符串数组,就像array of string 一样(显然)。所以编译器拒绝认为这些类型在没有强制转换的情况下兼容是不可取的和奇怪的。
  • @AndreasRejbrand:我使用的是 Delphi XE7,新版本是否接受没有类型转换的赋值?
  • 其实我以为10.3已经修复了,现在试了一下,好像没有。我还需要投。 (我知道 something 最近发生了与此相关的变化,但我不太记得它是什么。)但这就是类型系统的工作方式。例如,尝试定义type TDynStringArray = array of string; TDynStringArray2 = array of string;。如果没有演员表,它们将不兼容分配...
  • 我认为目前最好的解决方案是始终使用TArray&lt;string&gt; 作为动态字符串数组类型。 (例如,它优于array of string,因为它可以用作函数返回类型。并且它优于任何定义为array of string 的用户定义类型,因为它是核心RTL 的一部分,所以所有单元同意。)
  • @Fabrizio "新版本是否接受没有类型转换的分配?" - 在您的示例中,不接受。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-17
  • 1970-01-01
  • 2021-12-05
相关资源
最近更新 更多