今天我发现了一个编译器的错误(QC#108577)。
以下程序无法编译:
以下程序无法编译:
program Project1;
{$APPTYPE CONSOLE}
procedure P(M: TArray<TArray<Integer>>);
begin
SetLength(M, 1, 2);
end;
begin
end.
编译器在SetLength
这行代码上出错并显示以下错误信息:[dcc32 Error] E2029 ')' expected but ',' found
我知道我可以像这样修复它:
procedure P(M: TArray<TArray<Integer>>);
var
i: Integer;
begin
SetLength(M, 1);
for i := low(M) to high(M) do
SetLength(M[i], 2);
end;
但我自然希望避免不得已采用这种方法。
以下变量编译并似乎可以正常工作:
procedure P(M: TArray<TArray<Integer>>);
type
TArrayOfArrayOfInteger = array of array of Integer;
begin
SetLength(TArrayOfArrayOfInteger(M), 1, 2);
end;
我对动态数组的实现细节、TArray<T>
类型转换、引用计数等方面了解不足,无法确信这样做是否安全。
有没有人可以确认一下,在运行时这个方法是否能产生正确的代码?
System.pas
定义了TArray<T> = array of T;
,因此我期望硬转换 应该 能够工作。 - afrazierSystem.pas
中几乎所有的代码仍然必须是适当可编译的 Delphi 代码,对吗? - afrazier