문제

이것은 내 코드입니다.

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에서 깨끗하게 변환하는 것이 좋습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top