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(都只是单个变量)传递给它们各自类型的开放数组参数,而无需将其放在[]'s 之间,并且编译器不会将其直接返回给我吗?

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

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.

产生这个输出:

测试1整数
Test1OpenArray
测试2

我已经重载Test1,因此有一个接收整数的版本,以及一个接收开放整数数组的版本。在这种情况下,调用Test1(i)会转到仅接收整数的重载。另一方面,我可以调用Test2which 接收一个开放数组,只需传递一个整数。


我相信语言指南中没有记录这种行为。但是,@hvd 在编译器错误 E2192 的文档中发现了以下内容(强调我的):

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

于 2012-11-21T09:58:28.500 回答