为什么我不能在接收数组参数的函数中使用SetLength?

Mar*_*lka 8 delphi parameters

我试图使用以下函数来设置动态数组的长度,这是一个var param.我尝试编译代码时只有一个错误:

[dcc64错误] lolcode.dpr(138):E2008不兼容的类型

function execute(var command : array of string) : Boolean;
begin
  // Do something
  SetLength(command,0);
end;
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 17

您遇到了对数组参数的常见且基本的错误理解.你有什么:

function execute(var command: array of string): Boolean;
Run Code Online (Sandbox Code Playgroud)

实际上不是动态数组.它是一个开放的数组参数.

现在,您可以将动态数组作为参数传递给接收打开数组的函数.但是你无法修改动态数组的长度.您只能修改其元素.

如果需要修改动态数组的长度,则该过程必须接收动态数组.在现代的Delphi中,写作的惯用方法是:

function execute(var command: TArray<string>): Boolean;
Run Code Online (Sandbox Code Playgroud)

如果您使用的是不支持通用数组的旧版Delphi,则需要声明参数的类型:

type
  TStringArray = array of string;
....
function execute(var command: TStringArray): Boolean;
Run Code Online (Sandbox Code Playgroud)

您应该如何选择是使用开放数组还是动态数组参数?在我看来,如果可能的话,你应该总是使用开放数组.如果不可能,那么使用动态数组作为最后的手段.具有开放数组参数的函数的原因比具有动态数组参数的函数更通用.例如,您可以将常量大小的数组作为开放数组参数传递,但如果函数接收动态数组则不能.


And*_*and 9

定义类型

type
  TStringArray = array of string;
Run Code Online (Sandbox Code Playgroud)

你可以做到

function Execute(var StringArray: TStringArray): boolean;
begin
  // Do something
  SetLength(StringArray, 0);
end;
Run Code Online (Sandbox Code Playgroud)