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

DBe*_*nko 1 delphi types parameter-passing delphi-xe2

文档定义System.Types.TByteDynArray为:

type TByteDynArray = array of Byte;
Run Code Online (Sandbox Code Playgroud)

如果我创建一个这样的例程:

procedure DoSomething(args: array of Byte);
begin
end;
Run Code Online (Sandbox Code Playgroud)

并调用例程,没有编译错误:

DoSomething([1, 2, 3]);
Run Code Online (Sandbox Code Playgroud)

但是,如果我将例程所采用的类型更改为:

procedure DoSomething(args: TByteDynArray);
Run Code Online (Sandbox Code Playgroud)

以相同方式调用函数会产生此编译错误:

[DCC Error] E2010 Incompatible types: 'TByteDynArray' and 'Set'
Run Code Online (Sandbox Code Playgroud)

为什么不array of ByteTByteDynArray平等对待,显然它们应该是?我的代码库大量引用TByteDynArray,我想用这个方便的简写来代替创建这样的数组TByteDynArray.Create(1, 2, 3).

Dal*_*kar 5

即使语法看起来相同,你在这里处理两件事.

一种称为动态数组类型:type TByteDynArray = array of Byte;另一种是开放数组参数procedure DoSomething(args: array of Byte);

Open数组参数允许将任何给定类型的数组传递给过程,包括动态数组.

但是当你声明procedure DoSomething(args: TByteDynArray);你只能传递TByteDynArray变量时.

[1, 2, 3] 是静态数组,它与动态数组不兼容.

分配后会抛出相同的错误

var
  a: TByteDynArray;

a := [1, 2, 3];
Run Code Online (Sandbox Code Playgroud)

在Delphi []中也用于声明集,因此编译器认为您正在尝试将set分配给动态数组.

var
  s: set of byte;

  s := [1, 2, 3];
Run Code Online (Sandbox Code Playgroud)

  • 另请参阅此链接,[打开数组参数和const数组](http://rvelthuis.de/articles/articles-openarr.html),以获得有关开放数组概念的详细说明. (2认同)