C#에서 int에 열거를 캐스트 해야하는 이유는 무엇입니까?
문제
이것은 내 코드입니다.
internal enum WindowsMessagesFlags {
WM_EXITSIZEMOVE = 0x00000232,
WM_DISPLAYCHANGE = 0x0000007e,
WM_MOVING = 0x00000216,
}
protected override void WndProc(ref Message m) {
switch(m.Msg) {
case (int)WindowsMessagesFlags.WM_DISPLAYCHANGE:
FixWindowSnapping();
break;
case (int)WindowsMessagesFlags.WM_EXITSIZEMOVE:
SaveWindowProperties();
break;
case (int)WindowsMessagesFlags.WM_MOVING:
KeepProperLocation(ref m);
break;
}
}
어쨌든 캐스팅을 방지 할 수 있습니까?
해결책
일종의 - 캐스트 m.msg 대신 :
protected override void WndProc(ref Message m) {
switch((WindowsMessagesFlags) m.Msg) {
case WindowsMessagesFlags.WM_DISPLAYCHANGE:
FixWindowSnapping();
break;
case WindowsMessagesFlags.WM_EXITSIZEMOVE:
SaveWindowProperties();
break;
case WindowsMessagesFlags.WM_MOVING:
KeepProperLocation(ref m);
break;
}
}
캐스트가 필요한 이유는 C# Enums에서 숫자가 아니라 유형과 관련된 숫자가 있기 때문입니다. 이것은 당신이 (캐스팅없이)하는 것을 방해하지 않습니다.
HttpStatusCode status = someWindowsMessageFlag;
이것은 분명히 좋은 것입니다 :) 그러나 당신이 필요할 때, 당신은 항상 "기본 유형"을 통해 "이 경우 int)를 통해 갈 수 있습니다.
다른 팁
Message.msg는 무엇입니까?
나는 그것을 int32라고 내기하고있다.
또한 WindowsMessagesFlags를 베팅하는 것은 귀하의 유형이지만 메시지는 프레임 워크에서 나온 것입니다.
즉, 프레임 워크 제작 객체와 함께 자신의 열거를 사용하고 있으며 물론 유형과 관련하여 비 호환성을 갖게 될 것입니다.
열거는 단지 강한 유형입니다 숫자, 이것은 컨텍스트에 이름이있는 번호. 이 이름, 컨텍스트, 숫자, 부분은 숫자 만 직접 호환되지 않으므로 캐스트해야합니다.
한 가지 이유는 C# 현재 (4.0)가 확장 방법 내에 암시 적 연산자 과부하 (캐스트)를 쓸 수 없기 때문입니다.관련 질문) 열거를 포함한 모든 유형의 경우. 예를 들어 약하게 입력 한 데이터베이스와 통합 할 때 또는 약하게 입력 한 직렬화 형식 (Binary Writer)과 통합 할 때 int16에서 깨끗하게 변환하는 것이 좋습니다.
제휴하지 않습니다 StackOverflow