今天我发现了一个编译器错误(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>
强制转换、引用计数等的实现细节知之甚少,无法确信这是安全的。
有没有人知道足够的方式来说明这是否会在运行时产生正确的代码?