2013-11-26 32 views
4

我一直在經歷一個奇怪的情況,涉及重命名TValue數組類型,重命名TValue數組類型

TValueArray1 := TArray <TValue>; 
TValueArray2 := Array of TValue; 

我的意思是說,他們不應該有相似的行爲? 我有一個方法有一個常數開放的TValue數組作爲參數,但是當我用任何TValueArray替換它,編譯器開始期待序數值,爲什麼?

例如,工作正常;

// G1 - TGUID; B1 - TBytes; I1 - Integer; S1 - String 

procedure TAgBuffer.Add (const AData: Array of TValue); 
TAgBuffer.Add ([(TValue.From <TGUID> (G1)), TValue.From <TBytes> (B1), I1, S1]); 

但與任何TValueArray替換 'TValue的陣' 之後給出了以下編譯器錯誤: -

[dcc32 Error] Unit1.pas(44): E2001 Ordinal type required // for G1 
[dcc32 Error] Unit1.pas(44): E2010 Incompatible types: 'Integer' and 'TValue' // for B1 
+1

有開放數組和類型數組之間的差之差的鏈接。 –

+1

對於動態數組參數,不能使用開放數組構造函數語法(括號) - 請參閱http://qc.embarcadero.com/wc/qcmain.aspx?d=93549 –

+0

如果未來將此功能包含在內,那將會很棒發佈雖然... –

回答

4

你似乎會問,爲什麼這兩個是不同的:

procedure foo1(const a: array of Integer); 
procedure foo2(const a: TArray<Integer>); 

原因是foo1的參數是open array,參數foo2dynamic array。它們只是不同的野獸。您瞭解開放數組參數不同於動態數組非常重要。

我的經驗法則是,你應該儘量使用開放數組參數。原因是他們接受最廣泛的可能的實際參數。