【问题标题】:Invalid Typecast无效的类型转换
【发布时间】:2014-07-08 17:03:42
【问题描述】:

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

【问题讨论】:

    标签: delphi delphi-xe6


    【解决方案1】:

    您不能将开放数组参数强制转换为动态数组。它们简直是不相容的。如果您希望在不复制的情况下对数组的一部分进行操作,恐怕您需要分别传递数组和索引。像这样:

    procedure Foo(var A: TArray<Integer>; Index, Count: Integer);
    begin
      // operate on A[Index] to A[Index+Count-1]
    end;
    

    【讨论】:

      【解决方案2】:

      “X 数组”类型作为参数的含义与作为变量的含义不同。这里是open array,实际上和动态数组有很大不同。

      如果你想传递一个动态数组,你应该将参数类型设为TArray&lt;integer&gt;

      【讨论】:

      • 不幸的是,我很想将它作为开放数组参数传递,但我不能,因为Slice 函数不允许它。
      • @user3764855:有什么Slice可以做到Copy做不到的吗?
      • @user3764855: Copy(SomeArray) 确实会复制整个数组。 Copy(SomeArray, 0, SomeCount) 不会。
      • @MasonWheeler Slice 能做的一切,Copy 不能。 Slice 存在的理由是它不会复制。
      • @Rudy,我从来没有说过Copy(SomeDynArray,0,SomeCount); 不起作用。相反,它有效,但具有复制数组的负面影响,这就是我的问题的本质。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-10
      • 2012-11-19
      • 2011-10-05
      相关资源
      最近更新 更多