我想写一个附加到Integer数组的过程,但是Delphi IDE给了我编译时错误' Incompatyble类型'。这是我的代码:
procedure appendToIntegerArray(var intArr : array of Integer; valueToAppend : Integer);
var
counter : Integer;
begin
counter := Length(intArr);
SetLength(intArr, counter + 1); // This is where it gives me the compile-time error
intArr[counter] := valueToAppend;
end;
任何人都可以帮我修复手术吗?
答案 0 :(得分:5)
您正面临错误,因为SetLength
对动态数组进行操作而且不是动态数组。那是open array parameter。
您需要使用动态数组:
procedure appendToIntegerArray(var intArr: TArray<Integer>; valueToAppend: Integer);
....
如果您使用不支持通用数组的旧版Delphi,则需要声明该数组的类型:
type
TIntegerArray = array of Integer;
procedure appendToIntegerArray(var intArr: TIntegerArray; valueToAppend: Integer);
....
或者您可以使用RTL中声明的类型TIntegerDynArray
。此类型在Types
单位中声明。
Delphi类型系统的另一个烦恼是类似TIntegerArray
的类型与TIntegerDynArray
不兼容,因为它们是不同的类型。这使得处理使用不同数组类型的代码变得更加困难。泛型数组的一大好处是泛型的类型兼容性规则更加宽容。因此,如果您可以使用TArray<T>
,请执行此操作。
如果你逐项追加,那么我通常建议列表类会更好。在这种情况下,您可以使用TList<Integer>
并简单地调用其Add
方法。
答案 1 :(得分:4)
这是Delphi语法的一个怪癖:将array of whatever
声明为函数参数并不像您想象的那样将其定义为数组,而是将open array定义为“魔术”类型可以接受任何正确的基类型数组。如果要使用特定类型的数组,则需要命名类型。
这是泛型TArray<T>
的设计目标。如果可以,请将参数设为TArray<integer>
。如果没有,请考虑更新到更新版本的Delphi(如果你仍然使用旧版本,那么你会错过很多版本!)同时,声明一个类似的数组类型:
type
TMyIntegerArray = array of integer;
并使用该类型作为参数类型,而不是在那里声明array of integer
。