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 に答える