2012-10-10 2 views
4

개체 목록을 X ++에 저장하려고합니다. msdn에서 배열과 컨테이너가 Object를 저장할 수 없다는 것을 읽었으므로 유일한 옵션은 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(); 
    } 
} 

객체가 자동으로 컨테이너로 변환하지 않습니다 일반적으로는 (인터페이스 SysPackable 구현) packunpack 방법을 제공합니다. 위의 코드에서 부정 행위는 toString입니다.

반면에 목록에는 모든 유형이 포함되어야한다는 귀하의 요청에 대한 사용 사례가 표시되지 않습니다. 그것의 설계된 목적에 반하여, 목록은 List 객체가 생성 될 때 정의 된 하나의 타입을 포함합니다.

이외에도 목록에는 other collections types, 아마도 Struct이 필요합니다.

+0

코멘트 # 1 job2 실행 중 예외 발생 ... 코드 실행 오류 : 변환 함수의 인수 유형이 잘못되었습니다. 스택 추적 (C) \ Jobs \ Job2 - 행 6 –

+0

@BilalSaeed - "iVar = 1"을 주석 처리하고 anytype은 문자열에 바인딩되며 any2str이 작동합니다. –

+1

'any2str'가 제거되었으므로 int에 바인드 된'anytype'에 대해 작동하지 않습니다! –