数组 – 为什么TArray与recordType数组不同?
我有一个记录类型定义如下:
type TRecordType = record Field1: string; Field2: Variant; end; 当我像这样定义一个函数时: function Function1(const Records: TArray<TRecordType>): TAnyOtherClass; 并这样称呼它: Function1([BuildRecord('string',value),BuildRecord('OtherString',otherValue)]) 编译器说:
很久以前我读过一些地方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',otherValue)]) 你的论证中的语法就是所谓的open array constructor.这个文档说明了我的重点:
您的函数接受(通用)动态数组类型,它与open array不同.您的函数声明为 function Function1(const Records: TArray<TRecordType>): TAnyOtherClass; 该参数是(通用)动态数组类型.打开数组参数如下所示: function Function1(const Records: array of TRecordType): TAnyOtherClass; 我知道这看起来非常像动态数组的声明,但事实并非如此.在Delphi中,数组有两个不同的含义: >在参数列表的上下文中,数组用于声明打开的数组参数. 这种语言语法的重载是导致混淆的常见原因. 因此,由于所有这些,编译器拒绝您的代码,因为您尝试使用带有非开放数组的参数的开放数组构造函数. 我在这里的答案更详细地讨论了这个问题:https://stackoverflow.com/a/14383278/505088
我觉得你记错了.您所描述的更类似于C模板. Delphi泛型不是由预处理器处理的,尤其是因为Delphi没有预处理器. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |