【问题标题】:Why can I pass a var of type X to a open array parameter of that type?为什么我可以将 X 类型的 var 传递给该类型的开放数组参数?
【发布时间】:2012-11-21 09:43:53
【问题描述】:

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

p>

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

【问题讨论】:

    标签: delphi delphi-xe2 open-array-parameters


    【解决方案1】:

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

    考虑以下几点:

    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) 会转到只接收整数的重载。另一方面,我可以调用Test2,它接收一个开放数组,只需传递一个整数。


    我相信language guide 中没有记录这种行为。但是,@hvd 在documentation for compiler error E2192(强调我的)中发现了以下内容:

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

    【讨论】:

    • 它在错误 E2192 的文档中:“必须为开放数组参数提供实际数组变量、构造数组或参数元素类型的单个变量。”不过,我没有在我希望找到它的文档中看到它。
    • 好吧,我会被诅咒的......谢谢大卫。并感谢 @hvd 挖掘该错误文档。不完全是您期望在哪里找到此类信息。
    • @hvd 确实打得很好。我很想知道,你到底是怎么找到的?
    • @DavidHeffernan 我在帮助中搜索了“open array”(不在索引中,在搜索窗口中),那个是第二个结果。
    • @hvd 非常好。我倾向于不使用帮助,因为它需要很长时间才能开始,而且我没有耐心!我更喜欢看起来更快的在线版本!如果我这样做了,我也会找到那个话题。我是否真的会查看文档以获取我怀疑的错误消息。感谢您提醒我有可能在编译器错误文档中找到有用的信息块。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-28
    • 1970-01-01
    • 2020-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多