2009-12-06 5 views
6

Enum 걸리고 uint 캐스팅 함수를 쓰고 있어요. int으로 전송할 때 보았던 것부터 먼저 객체에 캐스팅해야합니다 ((int) (object) myEnumValue). (int) myEnumValue을 쓰면 컴파일 타임 예외가 발생합니다.열거 형 변환 캐스팅

자, 제가 이것을 uint로 캐스팅하려고했을 때, 나는 (uint) (object) myEnumValue이 괜찮을 것이라고 기대하고있었습니다. 멋지게 컴파일되지만 실행하면 InvalidCastException이 생성됩니다. 그래서 그것을 사용하려면, 내가 사용했습니다

(uint) (int) (object) myEnumValue 

나는 재미 있다고 생각합니다. 그래서 저는 그렇게 행복합니까?

는 어쩌면 uintobject을 캐스팅 할 수없는 이유를 물어 더 정확했을 것이다, 그러나 나는 Enum uint까지 갈 수있는 또 다른 방법이 있는지에 관심이 있어요. 거기 있니?

편집 :

컨텍스트 함수,이 같은 것입니다 :

public static uint ToUInt (Enum e) 
{ 
    return (uint) (int) (object) e; 
} 

편집 2 :

가장 좋은 해결책은 thecoop 언급 한대로 :

Convert.ToUInt32(e) 

답변

13

접근법은 기본적으로 C# 열거 형이 기본 형식으로 int을 사용하고 int이 박스형 일 때 사용하기 때문에 실패합니다. C# 구문을 사용하면 enum이 기본 유형 (예 : enum MyEnum : uint)에서 상속 된 것처럼 보입니다.

당신은 objectint 첫째로, 다음 int에서 uint에 숫자 변환을 수행에서 명시 적으로 언 박싱 컴파일러에게 있습니다. (구문이 동일하더라도, 값 유형 object에서 개봉기 것은 intuint 사이에 주조에서 다른 과정입니다.)

내가 int로 캐스팅 할 때 무엇을 본 적이에서
+0

자, Enum : Enint로 Enum을 지정하면 다른 방법일까요? –

+0

@ Jonatan : 예, 열거 형으로 열거 형 상자가되며 uint로 unbox해야합니다. –

+0

맞습니다. (uint) e는 괜찮지 만, (int) e는 폭발 할 것입니다. –

5

, 당신이 그것을 캐스팅해야 먼저 물체에 : (int) (object) myEnum. (int) myEnum을 쓰면 컴파일 타임 예외가 발생합니다.

사실이 아닙니다. enum 값을 정수 유형으로 직접 변환 할 수 있습니다.

이제 저는 이것을 uint로 캐스팅하려고했을 때, (uint) (object) myEnum이 괜찮을 것이라고 기대했습니다. 그것은 잘 컴파일되지만, 실행하면 InvalidCastException을 생성합니다. 작동 시키려면 다음을 사용했습니다. (uint) (int) (object) myEnum
재미있어 보이기 때문에 매우 행복하지만 왜 그렇게됩니까? 당신이 object에 열거 값을 캐스팅

, 그것은 기본적으로 int 자사의 기본 유형으로 박스됩니다.박스형 값을 실제 유형이 아닌 다른 유형으로 직접적으로 unbox 할 수는 없습니다. 심지어이 실패합니다

short s = 10; 
object o = s; 
int i = (int)o; // throws `InvalidCastException` while `int i = (int)s;` works. 
0

을 경우 당신이 반대 방향으로 이동해야합니다, 즉, 기초 유형에서 특정 유형의 열거에 :

enum MyEnumType { a, b, c }; 
//... 
MyEnumType enum_val = (MyEnumType)Enum.ToObject(typeof(MyEnumType), 2); 
Console.WriteLine(enum_val == MyEnumType.c); 
// "True" 

나는이 것으로 발견 제네릭 형식을 제작할 때 (단순 캐스팅보다는) 필요합니다. 열거 유형에 generic <T>을 충분히 제약하기 위해 'where'절을 사용할 수 없으므로 컴파일러에서 숫자를 캐스팅 할 수 없습니다.