delphi - 为什么我不能将字节数组传递给采用 TByteDynArray 的例程?

标签 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'

为什么 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/

相关文章:

delphi - 作为方法参数传递时如何避免评估 TFunc<TProc<T>>?

haskell -- 带有 TypeFamilies 扩展的 "where"语句中代码的奇怪的模棱两可的类型变量错误消息

scala - 如何用trait来描述算子?

python - 在运行时从 python Literal 类型中获取文字?

java - 将对象或 ArrayList 发送到 Wicket 中的另一个页面

c++ - 如何将抽象类型数组作为函数参数传递?

delphi - 在 Delphi 中使用旧式 `object` 而不是 `class` 有好处吗?

c++ - 如何更改窗体上所有控件的标题? [C++ 生成器]

delphi-xe3 - 整数数组的属性

c++ - Variadic 模板类的构造函数无法接受可变参数