2012-10-10 215 views
4

我想在X ++中存儲對象列表。我讀過msdn中的數組和容器不能存儲對象,所以唯一的選擇是創建一個Collection的列表。我寫了下面的代碼,並嘗試使用Collection = new List(Types::AnyType);Collection = new List(Types::Classes);,但兩者都不起作用。請看看我是否在以下工作中犯了一些錯誤。對象集合

static void TestList(Args _args) 
{ 
    List Collection; 
    ListIterator iter; 
    anytype iVar, sVar, oVar; 

    PlmSizeRange PlmSizeRange; 
    ; 
    Collection = new List(Types::AnyType); 

    iVar = 1; 
    sVar = "abc"; 
    oVar = PlmSizeRange; 
    Collection.addEnd(iVar); 
    Collection.addEnd(sVar); 
    Collection.addEnd(oVar);  

    iter = new ListIterator(Collection); 
    while (iter.more()) 
    { 
     info(any2str(iter.value())); 
     iter.next(); 
    } 
} 

此外,我們不能將一些變量或對象轉換爲Anytype變量,我讀出類型轉換自動完成這種方式;

anytype iVar; 
iVar = 1; 

但是在運行時拋出一個錯誤,期望類型是Anytype,但是遇到的類型是int。第一

回答

6

末的事情,anytype變量需要首先分配給它的類型,你以後不能更改:

static void Job2(Args _args) 
{ 
    anytype iVar; 
    iVar = 1;    //Works, iVar is now an int! 
    iVar = "abc";   //Does not work, as iVar is now bound to int, assigns 0 
    info(iVar); 
} 

回到第一個問題,new List(Types::AnyType)行不通的addEnd方法測試的類型,其參數在運行時,並且anytype變量將具有分配給它的值的類型。

new List(Types::Object)將只存儲對象,而不是簡單的數據類型爲intstr。 這可能與你(和C#)相信的相反,但簡單的類型不是對象。

還剩什麼?集裝箱:

static void TestList(Args _args) 
{ 
    List collection = new List(Types::Container); 
    ListIterator iter; 
    int iVar; 
    str sVar; 
    Object oVar; 
    container c; 
    ; 
    iVar = 1; 
    sVar = "abc"; 
    oVar = new Object(); 
    collection.addEnd([iVar]); 
    collection.addEnd([sVar]); 
    collection.addEnd([oVar.toString()]); 
    iter = new ListIterator(collection); 
    while (iter.more()) 
    { 
     c = iter.value(); 
     info(conPeek(c,1)); 
     iter.next(); 
    } 
} 

對象不會自動轉化爲容器,通常你提供packunpack方法(實現接口SysPackable)。在上面的代碼中使用toString這是作弊。

在另一方面,我沒有看到你的要求的使用情況,列出應該包含任何類型的。違反其設計目的,列表包含創建List對象時定義的唯一一種類型。

除了列表有other collections types,也許Struct將滿足您的需求。

+0

評論#1 運行job2時得到此異常... 執行代碼時出錯:轉換函數的參數類型錯誤。 堆棧跟蹤 (C)\作業\作業2 - 線6 –

+0

@BilalSaeed - 評出「的Ivar = 1」,並且將anytype類型被綁定到一個串和any2str將工作。 –

+1

刪除'any2str',它不適用於綁定到int的'anytype'! –