文档将System.Types.TByteDynArray
定义为:
type TByteDynArray = array of Byte;
如果我创建一个像这样的例程:
procedure DoSomething(args: array of Byte);
begin
end;
并像这样调用例程,没有编译错误:
DoSomething([1, 2, 3]);
但是,如果我将例程采用的类型更改为:
procedure DoSomething(args: TByteDynArray);
以相同方式调用该函数会产生此编译错误:
[DCC Error] E2010 Incompatible types: 'TByteDynArray' and 'Set'
为什么 byte 数组
和 TByteDynArray
没有得到同等对待,显然它们应该如此?我的代码库大量引用了 TByteDynArray
,我想使用这个方便的速记方式来创建此类数组,而不是 TByteDynArray.Create(1, 2, 3)
。
最佳答案
尽管语法看起来相同,但您在这里正在处理两件事。
其中一种称为动态数组类型:type TByteDynArray = array of Byte;
以及
另一个是开放数组参数procedure DoSomething(args: array of Byte);
Open array parameter允许将给定类型的任何数组传递给过程,包括动态数组。
但是当您声明 procedure DoSomething(args: TByteDynArray);
时,您只能将 TByteDynArray
变量传递给它。
[1, 2, 3]
是静态数组,与动态数组不兼容赋值。
以下分配会引发相同的错误
var
a: TByteDynArray;
a := [1, 2, 3];
在 Delphi 中,[]
也用于声明集合,因此编译器认为您正在尝试将集合分配给动态数组。
var
s: set of byte;
s := [1, 2, 3];
关于delphi - 为什么我不能将字节数组传递给采用 TByteDynArray 的例程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35431026/