可變類型的開放數組
現在回到文章開頭提到的可變類型的開放數組,可變類型的開放數組允許向單個過程或函數傳遞不同類型表達式的數組。要定義含有變體開放數組參數的方法,需要指定“array of const”或“array of TVarRec”作為參數類型
//定義含有變體開放數組參數的方法
procedure DoSomething(A: array of const);
procedure DoSomething(A: array of TVarRec);
array of const在定義參數時等價於array of TVarRec。array of const 只能指定參數的類型為可變類型的開放數組參數(array of TVarRec),而不能用其定義數組變量,但array of TVarRec還可以用來定義TVarRec類型的數組變量,而且可以將這個數組變量當作參數傳遞給可變類型的開放數組參數的方法。
var
arr:array of const;//錯誤
arr:array of TVarRec;//合法
DoSomething(arr);//合法
TVarRec類型用於含有array of const類型的參數的函數內部,編譯器自動通過開放數組構造器來構造開放數組參數的實參,將構造器中的每個元素轉換為TVarRec值,VType字段表示每個TVarRec值的簡單類型,可變類型常量(如vtInteger類型時的VInteger)表示為傳遞到TVarRec結構中的標記字段的值。
雖然TVarRec是可變類型,它能“容納”各種基礎數據類型,但這種“容納”是通過開放數組構造器來實現的,編譯器本身並不能自動實現,即TVarRec與其他數據類型是不兼容的,不能將其他類型的數組變量傳遞給開放數組參數的方法。
DoSomething([1,2,'a','tht']);//正確
var
arr:array[0..10] of Integer;
...//賦值
DoSomething(arr);//錯誤
開放數組構造器
開放數組構造器允許在函數或過程調用中直接構造數組;它們僅用於傳遞開放數組參數或可變類型開放數組參數。
與集合構造器相似,開放數組構造器是一個由方括號封裝、逗號隔開的表達式序列。開放數組構造器僅用於傳遞值參數或常量參數。構造器中的表達式必需與開放數組參數的基類型是賦值兼容的。對於可變類型開放數組參數的情況,表達式可以是不同類型的。