1

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

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,但我无法让静态数组工作。

4

3 回答 3

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.
于 2012-05-10T22:20:36.057 回答
2

我会说这是一个编译器错误/限制,你没有办法解决它。

我试过Slice这样使用:

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

这导致此编译器错误:

E2193 Slice standard function only allowed as open array argument

因此编译器无法识别显式运算符需要一个开放数组参数。

一个简单的方法调用而不是一个运算符就可以了,这进一步让我相信编译器根本不会玩球。

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

于 2012-05-10T20:11:37.837 回答
0

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

type 
  PMyRecord = ^TMyRecord;

// ...

begin
  PMyRecord(@a).DoWhatever;
end;
于 2012-05-11T09:00:34.910 回答