今天我发现了一个编译器错误(QC#108577).
以下程序无法编译:
program Project1;
{$APPTYPE CONSOLE}
procedure P(M: TArray<TArray<Integer>>);
begin
SetLength(M, 1, 2);
end;
begin
end.
Run Code Online (Sandbox Code Playgroud)
编译器在线上噱头SetLength说:
[dcc32 Error] E2029 ')' expected but ',' found
Run Code Online (Sandbox Code Playgroud)
我知道我可以像这样解决它:
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;
Run Code Online (Sandbox Code Playgroud)
但我自然希望避免不得不诉诸于此.
以下变体编译并且似乎有效:
procedure P(M: TArray<TArray<Integer>>);
type
TArrayOfArrayOfInteger = array of array of Integer;
begin
SetLength(TArrayOfArrayOfInteger(M), 1, 2);
end;
Run Code Online (Sandbox Code Playgroud)
我对动态数组,TArray<T>转换,引用计数等的实现细节知之甚少,以确信这是安全的.
是否有人知道这样或那样的方式是否会在运行时产生正确的代码?