Delphi记录静态数组的运算符

时间:2012-05-10 20:03:01

标签: delphi delphi-xe2

有没有办法让这样的工作成功?

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

type
  TMyRecord = record
    class operator Explicit(const a: array of integer): TMyRecord;
  end;

{ TMyRecord }

class operator TMyRecord.Explicit(const a: array of integer): TMyRecord;
begin
end;

var
  a: array[0..100] of integer;
begin
  TMyRecord(a);  //Incompatible types: 'array of Integer' and 'array[0..100] of Integer
end.

" TMyRecord.Explicit(const a:TIntegerDynArray)"适用于TIntegerDynArray,但我无法使静态数组工作。

3 个答案:

答案 0 :(得分:3)

如果将静态数组声明为类型:

,它可以正常工作(编译)
program Project1;

{$APPTYPE CONSOLE}

uses
  System.SysUtils;

type 
  TMyArray = array[0..100] of Integer;  

  TMyRecord = record 
    class operator Explicit(const a: TMyArray): TMyRecord; 
  end; 

class operator TMyRecord.Explicit(const a: TMyArray): TMyRecord; 
begin 
end; 

var 
  a: TMyArray; 

begin 
  TMyRecord(a); 
end;

end.

答案 1 :(得分:2)

我会说这是一个编译器错误/限制,你无法绕过它。

我尝试使用Slice这样:

TMyRecord(Slice(a, Length(a)));

导致此编译器错误:

E2193 Slice standard function only allowed as open array argument

因此编译器无法识别显式运算符期望打开数组参数。

普通的方法调用而不是操作符很好,这让我相信编译器根本就不会打球。

如果你不能使用开放阵列,那么你就没有干净的出路。

答案 2 :(得分:0)

另一种方法是通过变量的地址强制转换为指针类型:

type 
  PMyRecord = ^TMyRecord;

// ...

begin
  PMyRecord(@a).DoWhatever;
end;