为什么TArray <recordtype>与recordType数组不同?

时间:2015-09-03 13:10:32

标签: arrays delphi delphi-xe

我的记录类型定义如下:

type 
    TRecordType = record
        Field1: string;
        Field2: Variant;
    end;

当我像这样定义一个函数时:

function Function1(const Records: TArray<TRecordType>): TAnyOtherClass;

并以这种方式称呼它:

Function1([BuildRecord('string', value), BuildRecord('OtherString', otherValue)])

编译器说:

  

[DCC错误] AnyUnit.pas(142):E2001所需的序数类型

很久以前我读过一些地方,Delphi的编译器在一种预处理器中处理泛型,在代码中处理某种字符串替换,然后我期望Function1评估为:

function Function1(const Records: array of TRecordType): TAnyOtherClass;

因为TArray已定义为TArray<T> = array of T;

我认为它没有发生,因为当我将函数声明更改为:

function Function1(const Records: array of TRecordType): TAnyOtherClass;

编译代码时没有错误或警告。

this question上的答案链接到解释差异的文章,但链接已被破坏。所以我的问题是,TArray<T>如果不是array of T,意味着什么?

1 个答案:

答案 0 :(得分:3)

Function1([BuildRecord('string', value), BuildRecord('OtherString', otherValue)])

论证中的[...]语法就是所谓的open array constructor。本文档强调:

  

Open数组构造函数允许您直接在函数和过程调用中构造数组。它们只能作为传递打开数组参数或变量打开数组参数。

您的函数接受(通用)动态数组类型,该类型与open array不同。您的函数声明为

function Function1(const Records: TArray<TRecordType>): TAnyOtherClass;

该参数是(通用)动态数组类型。打开数组参数如下所示:

function Function1(const Records: array of TRecordType): TAnyOtherClass;

我知道这看起来非常像动态数组的声明,但事实并非如此。在Delphi中,array of有两个不同的含义:

  • 在参数列表的上下文中,array of用于声明打开的数组参数。
  • 在其他地方,array of定义了动态数组类型。

语法语法的重载是造成混淆的常见原因。

因此,由于所有这些,编译器会拒绝您的代码,因为您正在尝试使用不是开放数组的参数的开放数组构造函数。

我的回答更详细地讨论了这个问题:https://stackoverflow.com/a/14383278/505088

  

很久以前我读过一些地方,Delphi的编译器在一种预处理器中处理泛型,在代码中处理某种字符串。

我觉得你记错了。您所描述的更类似于C ++模板。 Delphi泛型不是由预处理器处理的,尤其是因为Delphi没有预处理器。