为什么我不能将一个字节数组传递给一个接受TByteDynArray的例程?

时间:2016-02-16 11:13:18

标签: delphi types parameter-passing delphi-xe2

文档将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 ByteTByteDynArray没有得到平等对待,显然它们应该是?我的代码库大量引用TByteDynArray,我希望使用这个方便的简写来创建这样的数组而不是TByteDynArray.Create(1, 2, 3)

2 个答案:

答案 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)

您可以使用isas运算符进行转换和检查。可以使用一些隐式转换,但编译器会发出警告。从长远来看,这是Delphi的优势。它可以让你做那些东西,但它不会让你快乐地拍摄自己的脚几乎 - 但不完全 - 相同,除非你明确要求它。

这是Delphi试图让愚蠢的人做的愚蠢行为之一。学习用安全带驾驶。它不是那么痛苦,而且更安全。