文档将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'
为什么array of Byte
和TByteDynArray
没有得到平等对待,显然它们应该是?我的代码库大量引用TByteDynArray
,我希望使用这个方便的简写来创建这样的数组而不是TByteDynArray.Create(1, 2, 3)
。
答案 0 :(得分:5)
即使语法看起来相同,你也在处理两件事。
一种称为动态数组类型: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];
答案 1 :(得分:0)
您可以使用is
和as
运算符进行转换和检查。可以使用一些隐式转换,但编译器会发出警告。从长远来看,这是Delphi的优势。它可以让你做那些东西,但它不会让你快乐地拍摄自己的脚几乎 - 但不完全 - 相同,除非你明确要求它。
这是Delphi试图让愚蠢的人做的愚蠢行为之一。学习用安全带驾驶。它不是那么痛苦,而且更安全。