有没有办法让这样的工作成功?
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,但我无法使静态数组工作。
答案 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;