用于静态数组的Delphi记录运算符

用于静态数组的Delphi记录运算符,delphi,delphi-xe2,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: a

有没有办法让这样的事情成功

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

我认为这是一个编译器错误/限制,您没有办法解决它

我试着像这样使用
Slice

TMyRecord(Slice(a, Length(a)));
这将导致此编译器错误:

E2193 Slice standard function only allowed as open array argument
因此,编译器无法识别显式运算符是否需要打开数组参数

一个简单的方法调用而不是一个操作符是很好的,这进一步让我相信编译器是不会玩球的


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

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

我试着像这样使用
Slice

TMyRecord(Slice(a, Length(a)));
这将导致此编译器错误:

E2193 Slice standard function only allowed as open array argument
因此,编译器无法识别显式运算符是否需要打开数组参数

一个简单的方法调用而不是一个操作符是很好的,这进一步让我相信编译器是不会玩球的

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

如果您将静态数组声明为一种类型,那么它可以工作(很好,编译):

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.
如果将静态数组声明为一种类型,则它可以工作(很好,可以编译):

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.

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

type 
  PMyRecord = ^TMyRecord;

// ...

begin
  PMyRecord(@a).DoWhatever;
end;

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

type 
  PMyRecord = ^TMyRecord;

// ...

begin
  PMyRecord(@a).DoWhatever;
end;

谢谢,但是在我们的例子中,数组可以有不同的大小。谢谢,但是在我们的例子中,数组可以有不同的大小。