Utilizzo di Delphi XE-2 (tutti gli aggiornamenti applicati).Perché posso passare una var di tipo X ad un parametro di array aperto di quel tipo?
Mi aspetto che il seguente codice generi errori di compilazione sulle chiamate DoSomething e DoInteger, ma non lo fa.
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.
Qualcuno può spiegare perché posso passare FData/FInteger - sia solo singole variabili, ad un parametro open array dei rispettivi tipi senza metterlo tra []
's e senza il compilatore barfing a destra verso di me?
Ho pensato che potrebbe avere a che fare con una serie di interfacce, o anche con i generici coinvolti, ma il compilatore accetta anche un intero passato a un array aperto di numeri interi.
È nella documentazione per l'errore E2192: "Gli argomenti di array aperti devono essere forniti con una variabile di array effettiva, un array costruito o una variabile singola del tipo di elemento dell'argomento." Non lo vedo nella documentazione in cui mi aspettavo di trovarlo, però. – hvd
Beh, sarò dannatamente ... Grazie David. E grazie a @hvd per aver recuperato la documentazione di errore. Non esattamente dove ti aspetteresti di trovare tali informazioni. –
@hvd Ben giocato davvero. Mi piacerebbe sapere, come mai l'hai trovato? –