2008-11-28 2 views
8

Это мой код:Почему мне нужно вводить перечисления в int на C#?

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; 
    } 
} 

Есть в любом случае, чтобы предотвратить отливку?

ответ

25

Сорт - литое 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# перечисления не просто цифры - они число, связанное с типом. Это мешает вам делать (без литья):

HttpStatusCode status = someWindowsMessageFlag; 

Это явно хорошая вещь :) Когда вам нужно, однако, вы можете всегда идти «через» базовый тип (междунар в данном случае).

2

Что такое Message.Msg как?

Я уверен, что это Int32.

Я также делаю ставки, что WindowsMessagesFlags - это ваш тип, но сообщение отправлено из фреймворка.

Это означает, что вы используете свой собственный enum с фреймворком, и, конечно же, у них будут некоторые несовместимости в отношении типов.

Перечисление сильный тип, а не только число, это номер с именем в контексте. Это имя, контекст, номер, часть напрямую не совместимы с просто цифрами, и поэтому вам нужно бросить.

0

Одна из причин заключается в том, что C# в настоящее время (4.0) не позволяет вам писать неявную перегрузку оператора (литье) в методе расширения (related question) для любого типа, включая перечисление. Было бы неплохо чисто конвертировать в/из Int16 при интеграции со слабо типизированной базой данных, например, или в слабо типизированный формат сериализации (двоичный писатель).

Смежные вопросы