2009-07-03 2 views
3

나는 목록에서 System.Management.ManagementObjectCollection 인 항목을 조작하고 있습니다. 각 항목은 문자열로 인덱싱 된 속성을 포함하는 System.Management.ManagementObject입니다. 나는 사전에 자신의 "진짜"유형을 알고 있고, 그 괜찮아요 - queryObjSystem.Object에서 ushort를 가져 와서 왜 그것을 Uint로 변환 할 수 없습니까? (C#)

foreach (ManagementObject queryObj in searcher.Get()) 
{ 
    string osversion = (string)queryObj["Version"]; 
    string os = (string)queryObj["Name"]; 
    uint spmajor = (uint)queryObj["ServicePackMajorVersion"]; 
    uint spminor = (uint)queryObj["ServicePackMinorVersion"]; 
    ... 
    ... 
    ... 
} 

각 "사전 액세스"속성이 있어야하는데 어떤 사실에있는 C# object을 반환 참조하십시오.

문제는 uint 캐스트에 InvalidCastException이 표시됩니다. 나는 실제 타입 인 ushort을 사용해야한다. ushort에서 uint까지 캐스트를 허용해서는 안됩니까?

이 경우

, 나는 결국 string에 값을 변환,하지만 뭐 내가 uint 또는 int 또는 long 변수로 얻을해야한다면?

답변

18

unbox ushort를 시도하고 있습니다. 해당 사용자 이름은 ushort에서만 언 박싱 할 수 있습니다.

상자를 풀고 나면 정상적으로 전송할 수 있습니다.

T 유형의 모든 박스 값은 T (또는 Nullable)에만 언 박싱 할 수 있습니다.

에릭 리 퍼트 (Eric Lippert)는 정확한 내용 인 here에 대해 아주 좋은 블로그 게시물을 작성했습니다.

+0

. 바로 기억할 수있는 것은 int에 기본 "int"유형이있는 열거 형을 unbox 할 수 있고 그 반대도 가능하다는 것입니다. 내가 처음 그것을 보았을 때 나는 가장 놀랐다. –

+0

하하, 놀라 울 정도예요 :-) 또한 Eric은 Nullable에 캐스팅 할 수 있다는 또 다른 예외를 언급했습니다. –

+0

Jon, 아마도 여기에 이해가 부족함을 보여주고 있지만 Enums는 박스에 들어 있나요? 그들이 그렇지 않다면 나는 박스형에만 적용되기 때문에이 규칙에 위배되지 않는다고 말하고 싶습니다. –

2

캐스팅 연산자의 문제점은 실제로 캐스트와 변환의 두 가지를 의미합니다. 숫자의 값을 다른 숫자로 변환 할 수는 있지만 박스형 숫자를 잘못된 유형의 숫자로 변환 할 수는 없습니다. 따라서, 당신이 대신해야 할 것입니다 것은 :

uint spmajor = (uint)(ushort)queryObj["ServicePackMajorVersion"]; 

더 나은 아직 : 실제로,이 몇 가지 예외가 있습니다

uint spmajor = Convert.ToUInt32(queryObj["ServicePackMajorVersion"]);