2012-11-21 54 views
9

使用Delphi XE-2(應用了所有更新)。爲什麼我可以將類型X的var傳遞給該類型的開放數組參數?

我期望以下代碼在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 - 都只是單一變量,它們各自類型的開放數組參數,而不把它[]的之間並沒有編譯器在我barfing它右後衛?我認爲它可能與一個接口數組,甚至涉及的泛型有關,但編譯器也接受一個傳遞給一個整數開放數組的整數。

回答

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(重點煤礦)執行以下操作:

打開數組參數必須與實際的數組變量,一個構造陣列或參數的元素類型的單可變供給。

+3

它在錯誤E2192的文檔中:「Open數組參數必須提供一個實際的數組變量,一個構造數組或單個變量的參數元素類型。」儘管如此,我沒有在我期望找到它的文檔中看到它。 – hvd

+1

嗯,我會很高興的......謝謝大衛。並感謝@ hvd挖掘錯誤文檔。不完全是你期望找到這樣的信息的地方。 –

+1

@ hvd好了,我很想知道,你究竟是怎麼發現的? –

相關問題