我的记录类型定义如下:
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
,意味着什么?
答案 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没有预处理器。