当前位置 : 主页 > 编程语言 > delphi >

数组 – 为什么TArray与recordType数组不同?

来源:互联网 收集:自由互联 发布时间:2021-06-23
我有一个记录类型定义如下: type TRecordType = record Field1: string; Field2: Variant; end; 当我像这样定义一个函数时: function Function1(const Records: TArrayTRecordType): TAnyOtherClass; 并这样称呼它: Func
我有一个记录类型定义如下:

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

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

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

并这样称呼它:

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

编译器说:

[DCC Error] AnyUnit.pas(142): E2001 Ordinal type required

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

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

因为TArray被定义为TArray< T>. = T的数组;

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

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

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

在this question上有一个答案链接到解释差异的文章,但链接被破坏.所以我的问题是,什么意味着TArray< T>如果不是T的数组?

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

你的论证中的语法就是所谓的open array constructor.这个文档说明了我的重点:

Open array constructors allow you to construct arrays directly within function and procedure calls. They can be passed only as open array parameters or variant open array parameters.

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

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

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

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

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

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

这种语言语法的重载是导致混淆的常见原因.

因此,由于所有这些,编译器拒绝您的代码,因为您尝试使用带有非开放数组的参数的开放数组构造函数.

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

I have read some place a long time ago that Delphi’s compiler handles generics in a kind of preprocessor and some kind of string replace in code.

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

网友评论