今日、コンパイラのバグ ( 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>
これが安全であると確信するには、動的配列、キャスト、参照カウントなどの実装の詳細について十分に知りません。
これが実行時に正しいコードを生成するかどうかを何らかの方法で言うのに十分な人はいますか?