gpt4 book ai didi

arrays - 为什么 TArray 与 recordType 数组不同?

转载 作者:行者123 更新时间:2023-12-03 15:12:10 25 4
gpt4 key购买 nike

我的记录类型定义如下:

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> = array of T; .

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

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

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

[这个问题]有答案1该链接指向一篇解释差异的文章,但该链接已损坏。

所以我的问题是,TArray<T> 是什么意思?如果没有array of 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 中,array of 有两个不同的含义:

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

这种语言语法的重载是造成困惑的常见原因。

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

我在这里的回答更详细地讨论了这个问题: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 没有预处理器。

关于arrays - 为什么 TArray<recordType> 与 recordType 数组不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32376610/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com