当我尝试在程序中将Array of Integer
转换为TArray<Integer>
时,我收到错误E2089 Invalid typecast
。如何输入它以使其起作用?
program Project11;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
System.Math;
type
TArrayManager<T> = record
class procedure Shuffle(var A: TArray<T>); static;
end;
class procedure TArrayManager<T>.Shuffle(var A: TArray<T>);
var
I, J: Integer;
Temp: T;
begin
for I := High(A) downto 1 do
begin
J := RandomRange(0, I);
Temp := A[I];
A[I] := A[J];
A[J] := Temp;
end;
end;
procedure Test(var A: Array of Integer);
begin
TArrayManager<Integer>.Shuffle(TArray<Integer>(A)); // Invalid typecast????
end;
var
A: Array of Integer;
begin
// TArrayManager<Integer>.Shuffle(TArray<Integer>(A)); // Works
Test(A);
end.
答案 0 :(得分:3)
X&#34;的类型&#34;数组;意味着不同的东西作为参数而不是变量。这是一个open array,它实际上与动态数组非常不同。
如果要传递动态数组,则应该设置参数类型TArray<integer>
。
答案 1 :(得分:3)
您无法将开放数组参数强制转换为动态数组。它们完全不兼容。如果你希望在没有复制的情况下操作数组的一部分,我担心你需要分别传递数组和索引。像这样:
procedure Foo(var A: TArray<Integer>; Index, Count: Integer);
begin
// operate on A[Index] to A[Index+Count-1]
end;