【发布时间】:2012-09-07 15:00:48
【问题描述】:
今天我发现了一个编译器错误 (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;,所以我希望硬演员应该起作用。 -
任何一个都以 'DynArraySetLength' 结尾(至少一个具有一维数组),所以我同意上述观点..
-
@afrazier System.pas 是特殊的,对于
TArray<T>可能有一些特殊的编译器魔术内在处理。这就是我所关心的。自然,他们不太可能实现一个新的不兼容的数组代码,而不是使用他们已经拥有的久经考验的代码。 -
@SertacAkyuz 这是非常有力的证据。您能否将其扩展为答案?
-
XE4 中修复了该错误。
标签: delphi generics casting delphi-xe2 dynamic-arrays