Сегодня я обнаружил ошибку компилятора (QС# 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>
литье, подсчете ссылок и т.д., чтобы быть уверенным, что это безопасно.
Есть ли кто-нибудь, кто знает достаточно, чтобы сказать так или иначе, будет ли это выдавать правильный код во время выполнения?