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

标签 delphi delphi-xe2 open-array-parameters

使用 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 - 两者都只是单个变量传递给各自类型的开放数组参数,而无需将其放在 [] 之间,并且编译器不会正确处理它回到我身边?

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

最佳答案

编译器有点宽松,因为这样做没有歧义。

考虑以下因素:

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.

产生以下输出:

Test1Integer
Test1OpenArray
Test2

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

<小时/>

我认为 language guide 中没有记录此行为。然而,@hvd 在 documentation for compiler error E2192 中发现了以下内容: (强调我的):

Open array arguments must be supplied with an actual array variable, a constructed array or a single variable of the argument's element type.

关于delphi - 为什么我可以将 X 类型的 var 传递给该类型的开放数组参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13490338/

相关文章:

delphi - 将开放数组传递给匿名函数

delphi - 将常量传递给作为开放记录数组的函数参数

string - 如何在 TVarRec 中设置字符串(或 AnsiString)常量?

delphi - 当显示第二个表单时,如何阻止 UI 锁定?

delphi - 数据输入屏幕实时更新模型对象,提供撤消和重做,使用命令模式对模型对象进行实时更新

windows - 如何在不禁用子控件功能的情况下从其客户区拖动我的表单?

windows - 如何使用 delphi 导入(合并)reg 文件?

delphi - 关闭新的 Delphi 2010 查找功能

delphi - 如何在IMAP邮箱中搜索特定的电子邮件?