为什么我可以将类型X的var传递给该类型的open数组参数?

Mar*_*ema 9 delphi open-array-parameters delphi-xe2

使用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.
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么我可以将FData/FInteger(只是单个变量)传递给它们各自类型的开放数组参数而不将它放在它之间[]并且没有编译器将它直接反馈给我吗?

我认为它可能与接口数组,甚至涉及的泛型有关,但编译器接受传递给整数的开放数组的整数.

Dav*_*nan 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.
Run Code Online (Sandbox Code Playgroud)

产生这个输出:

Test1Integer
Test1OpenArray
Test2

我已经重载了,Test1所以有一个版本接收一个整数,一个版本接收一个开放的整数数组.在那种情况下,调用Test1(i)转到只接收整数的重载.另一方面,我可以Test2通过传递一个整数来调用哪个接收一个开放数组.


我认为语言指南中没有记录此行为.但是,@ hvd在编译器错误E2192(强调我的)的文档中找到以下内容:

必须为开放数组参数提供实际的数组变量,构造的数组或参数元素类型单个变量.

  • 它出现在错误E2192的文档中:"Open数组参数必须提供实际的数组变量,构造的数组或参数元素类型的单个变量." 但是,我没有在文档中看到它,我希望找到它. (3认同)