- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的记录类型定义如下:
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/
在 C++ 中我可以做到 class A { public: A(std::vector> v) : _v(std::move(v)) {} private: std::vector>
我想知道以下代码是否会可靠地返回 nullptr 而不会出现任何复杂情况: TArray SomeActors; ASomeActor* SomeActor = SomeActors[0]; retu
我正在寻找一种更好的方法来初始化我的 lst_devices : TArray变量。 今天,我是这样做的(这非常丑陋,而且有代码味道,但至少可以正常工作)。 lst_devices_id := [''
uses Generics.Collections, types, rtti, System.Generics.Collections; procedure GimmePairArray(cons
这是什么原因TArray.Sort当我比较中有大量数字时不起作用? 我的代码如下(Delphiy Tokyo): Interface Type RCInd = record N
我刚刚开始接触这个。 PNode = ^TNode; TNode = record Obstacle : boolean; Visited : boolean; GCost : doubl
当我发现这样的构造实际上可以编译并产生所需的结果时,这只是偶然的: var Arr: TArray; begin Arr := TArray.Create(100, 101, 102); en
我有这个代码 var arr: TArray; e1, e2, e3, e4: string; begin e1 := 'val1'; e2 := 'val2'; e3 := 'val3'; e4 :
如何分配 TArray至array of Byte反之亦然? TEncoding.UTF8.GetBytes返回 TArray 。 TIdHashMessageDigest5.HashBytes有一个
我的代码的很大一部分( delphi-dutil 等)使用 TStringDynArray 。现在我想将所有键转换为 TDictionary到 TStringDynArray 。不幸的是我只找到了TD
在Delphi XE2的帮助中System.Generics.Collections.TArray.Sort ,它说 Note: If the Comparer parameter is provid
我知道 array of const被“翻译”为array of TVarRec由编译器所以我想知道是否有一种方法可以直接存储开放数组的副本(或者可能使用 const 的引用),我的意思是无需创建循环
虚幻引擎(C++) 您好,我有一个来自 TCP 连接的 TArray of Bytes。我有 58 字节的 header 和 12 x 4 字节的 Float32。我需要从我的 Array Bytes
这 3 种类型非常相似... TArray 是 TBytes 的通用版本。两者都可以转换为 PByteArray 并用作调用 Windows API 的缓冲区。 (与字符串到 Pchar 具有相同的限
我的记录类型定义如下: type TRecordType = record Field1: string; Field2: Variant; end;
我有很多变量声明为 var Something: array of XXX; begin SetLength(Something, 10); try ... finally
今天我发现了一个编译器错误 ( QC#108577 )。 以下程序无法编译: program Project1; {$APPTYPE CONSOLE} procedure P(M: TArray>);
我已将 outputBuffer 声明为 Byte 并相应地使用它: TFile.WriteAllBytes(outputPath, outputBuffer); 当我编译程序时,Delphi 输出:
我正在向在线 API 发出 GET 请求,但无法获取嵌套的 Json 值以设置为 C++(虚幻引擎 4)中的数组。我得到了除嵌套数组 LE (key) 之外的所有值 这里是 JSON {
我正在将旧版 Delphi 应用程序迁移到 Delphi-XE2,我想知道是否有充分的理由替换定义为 Array of MyType 的数组。至TArray 。那么问题来了 TArray 的优缺点是什
我是一名优秀的程序员,十分优秀!