使用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(只是单个变量)传递给各自类型的开放数组参数而不将它放在[]
之间并且没有编译器将它直接反馈给我吗?
我认为它可能与接口数组或甚至涉及的泛型有关,但编译器也接受传递给整数的开放数组的整数。
答案 0 :(得分: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.
产生这个输出:
Test1Integer Test1OpenArray Test2
我已经重载了Test1
,因此有一个接收整数的版本,以及一个接收一个开放的整数数组的版本。在那种情况下,调用Test1(i)
转到仅接收整数的重载。另一方面,我可以通过传递一个整数来调用接收开放数组的Test2
。
我认为language guide中未记录此行为。但是,@ hvd在documentation for compiler error E2192(强调我的)中发现了以下内容:
必须为开放数组参数提供实际数组变量,构造数组或参数元素类型的单个变量。