无效的Typecast

时间:2014-07-08 17:03:43

标签: delphi delphi-xe6

当我尝试在程序中将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.

2 个答案:

答案 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;