Delphi 我可以将未命名的动态数组类型作为Var参数吗

Delphi 我可以将未命名的动态数组类型作为Var参数吗,delphi,delphi-2010,Delphi,Delphi 2010,使用D2010,我想做如下操作: procedure SizeArray(var aArr: array of integer; aSize: integer); begin SetLength(aArr,aSize); end; var x: array of Integer; type TArray<T> = array of T; 但这无法编译。因为我的“aArr”参数不是动态数组,所以它是一个开放数组参数。无法对其调用SetLength。我所知道的强制参数成

使用D2010,我想做如下操作:

procedure SizeArray(var aArr: array of integer; aSize: integer);
begin
  SetLength(aArr,aSize);
end;
var
  x: array of Integer;
type
  TArray<T> = array of T;
但这无法编译。因为我的“aArr”参数不是动态数组,所以它是一个开放数组参数。无法对其调用SetLength。我所知道的强制参数成为动态数组的唯一方法是给它一个类型名,如下所示:

type
  TIntArray = array of integer;

procedure SizeArray(var aArr: TIntArray; aSize: integer);
begin
  SetLength(aArr,aSize);
end;
现在代码已经编译好了。在大多数情况下,它运行良好,但这失败了:

procedure Test;
var
  a : array of integer;
begin
  SizeArray(a,5);
end;
因为实际变量参数和形式变量参数的类型必须相同,并且编译器不会将“整数数组”和“TIntArray”识别为相同的类型

因此,我的问题是:是否有某种方法可以让编译器将我的var参数标识为动态数组而不是开放数组,以便调用方可以声明一个简单的“整数数组”而不是某个命名类型


提前谢谢。

不,没有办法。它是Pascal语言规范的一部分,不太可能改变


编辑:斯卡姆拉特找到了一条路。让我重申一下。没有办法安全地做到这一点

这确实是可能的……只需使用绝对关键字和非类型化变量

procedure SizeArray(var aArr; aSize: integer);
var
  ActArr : Array of Integer absolute aArr;
begin
  SetLength(ActArr,aSize);
end;

var
  Test : Array of Integer;
begin
  SizeArray(Test,5);
  showMessage(IntTostr(High(Test)));  // -- returns 4
end;

Pascal和Delphi扩展对数组类型(包括动态数组)使用名称等价而不是结构等价。使用没有名称的类型声明的变量,如下所示:

procedure SizeArray(var aArr: array of integer; aSize: integer);
begin
  SetLength(aArr,aSize);
end;
var
  x: array of Integer;
type
  TArray<T> = array of T;
。。。最终使用的匿名名称与任何其他类型的名称都不等效。这就是为什么你会出错。误差可能是有用的;例如,考虑一个数组:<代码>公里>代码>与一个数组>代码>千克< /代码> -但通常情况下,为每个不同的类型声明一个名称是不方便的。 为了避免这个问题,并保持在安全类型系统中(如skamradt所建议的那样,避免非类型化参数),我建议对每个特定数组形状使用相同的名称。通过使用系统单元中声明的
TArray
类型,可以在相当大的程度上实现这一点。因此,使用
TArray
,而不是使用整数数组

TArray
声明如下:

procedure SizeArray(var aArr: array of integer; aSize: integer);
begin
  SetLength(aArr,aSize);
end;
var
  x: array of Integer;
type
  TArray<T> = array of T;
类型
TArray=T的数组;

。。。因此,它可以为任意动态数组提供名称。

为什么要/需要?这是标准的Pascal用法。您只需将“a”声明为:数组。如果您使用的是遗留代码,那么无论如何都需要对其进行更改(以添加对SizeArray的调用)。我假设SizeArray只是一个示例,否则为什么不直接调用SetLength>强制调用方使用命名类型呢?但这不是我的偏好。我想要一些不需要的东西,可以接受简单的“X数组”类型。所以我想我应该问一下,看看是否可以做到。打电话的人使用正确的类型真的没什么大不了的。对于记录和类类型,您总是这样做,那么为什么其他结构化类型不这样做呢?这是一个程序员会很快发现的需求,因为代码在其他情况下不会编译,所以这不像是你放了一个滴答作响的定时炸弹,直到产品即将上市时才会爆炸。只要确保使用RTL提供的类型(如果有的话),而不是编写自己的声明。啊,但是没有rails的编程会给混合带来一点刺激。。。哦,等等,那是昨晚调试的最后一轮可乐我总是在没有rails的情况下编程。老实说,我从来都不是Ruby的忠实粉丝……)+1表示极度聪明。我已经开始走巴里·凯利的路了,所以我接受他的答案。但是,为了找到一条路。。。我印象深刻。:)我没有注意到系统中的声明。那很好。我认为养成这样声明数组的习惯会很有用。起初,我认为系统中的TArray与泛型集合中的TArray冲突,但我想不会,因为那个不是泛型。这是一个很好的解决方案。谢谢