用于静态数组的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;
谢谢,但是在我们的例子中,数组可以有不同的大小。谢谢,但是在我们的例子中,数组可以有不同的大小。