9

Delphi XE-2 を使用する (すべての更新が適用されます)。

次のコードでは、DoSomething および DoInteger の呼び出しでコンパイル エラーが生成されると思いますが、そうではありません。

program OpenArrayQuestion;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils;

type
  IComposite = interface(IInterface)
  ['{1AC3CF6A-1316-4838-B67B-9FB075585C1E}']
  end;

  IComposite<T: IComposite> = interface(IComposite)
  ['{7F866990-9973-4F8E-9C1F-EF93EF86E8F2}']
  end;

function DoSomething(const aData: array of IComposite): Boolean;
begin
  Result := True;
end;

function DoInteger(const aData: array of Integer): boolean;
begin
  Result := True;
end;

var
  FData: IComposite;
  FInteger: Integer;
begin
  DoSomething(FData);
  DoInteger(FInteger);
end.

FData/FInteger を渡すことができる理由を誰かが説明できますか[]?

インターフェイスの配列、または関連するジェネリックに関係している可能性があると思いましたが、コンパイラは整数のオープン配列に渡された整数も受け入れます。

4

1 に答える 1

7

あいまいさがないため、コンパイラは少し緩いです。

次の点を考慮してください。

program OpenArrays;

{$APPTYPE CONSOLE}

procedure Test1(i: Integer); overload;
begin
  Writeln('Test1Integer');
end;

procedure Test1(i: array of Integer); overload;
begin
  Writeln('Test1OpenArray');
end;

procedure Test2(i: array of Integer);
begin
  Writeln('Test2');
end;

var
  i: Integer;

begin
  Test1(i);
  Test1([i]);
  Test2(i);
  Readln;
end.

次の出力が生成されます。

Test1整数
Test1OpenArray
テスト2

オーバーロードTest1して、整数を受け取るバージョンと、整数のオープン配列を受け取るバージョンがあるようにしました。そのような状況では、呼び出しTest1(i)は整数のみを受け取るオーバーロードに行きます。一方、Test2整数を渡すだけで、オープン配列を受け取る呼び出しを行うことができます。


この動作は、言語ガイドには記載されていないと思います。ただし、@hvd は、コンパイラ エラー E2192 のドキュメントで次のことを発見しました(強調は私のものです)。

オープン配列引数には、実際の配列変数、構築された配列、または引数の要素型の単一変数を指定する必要があります。

于 2012-11-21T09:58:28.500 に答える