编译器允许我执行以下操作:
procedure MyProc(const ADynData: array of string);
或
procedure MyProc(const ADynData: TStringDynArray);
并像这样传递任意数据:
MyProc(['Data1', 'Data2']);
但是,不允许
function MyFunc: TStringDynArray;
....
function MyFunc: TStringDynArray;
begin
Result := ['Data1', 'Data2'];
end;
或
function MyFunc: TStringDynArray;
const
CDynData: array[0..1] of string = ('Data1', 'Data2');
begin
Result := CDynData;
end;
这是为什么呢?这在技术上不是一样的吗?
对于这些特定场景,返回任意字符串数组的推荐(也是最有效)的方法是什么?
最佳答案
不,这不是同一件事。在
procedure MyProc(const ADynData: array of string);
参数是 open array parameter ,这与“普通”动态数组不同。 [..]
语法只能用于在函数的开放数组参数中创建开放数组。 (否则,[..]
用于在代码中指定集合,例如Font.Style := [fsBold, fsItalic]
。但是sets 只能将序数类型作为其“基本类型”,因此仍然不存在“字符串集”之类的东西。)
换句话说,不可能像您在第二个代码片段中尝试的那样在代码中编写动态数组,
function MyFunc: TStringDynArray;
begin
result := ['Data1', 'Data2']; // Won't work.
end;
但是,在新版本的 Delphi 中,这几乎是可能的:
type
TStringDynArray = array of string;
function MyFunc: TStringDynArray;
begin
result := TStringDynArray.Create('A', 'B');
end;
最后,
function MyFunc: TStringDynArray;
const
CDynData: array[0..1] of string = ('Data1', 'Data2');
begin
result := CDynData;
end;
不起作用,因为 TStringDynArray
是 dynamic array ,而 CDynData
是 static array ,这是两种不同的基本类型。
关于arrays - 为什么我不能返回任意字符串数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15923602/