2008-11-28 53 views
8

这是我的代码:为什么我必须在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; 
    } 
} 

反正是有防止铸件?

回答

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; 

这显然是一件好事:)当你需要,但是,你可以随时去“内经”(在这种情况下INT)的基本类型。

2

什么是Message.Msg定义为?

我打赌它是Int32。

我也打赌WindowsMessagesFlags是你的类型,但消息来自框架。

这意味着你使用自己的枚举与一个框架构建的对象,当然他们会有一些不兼容的类型。

枚举是一个强类型,不只是一些,它是一个数与上下文的名称。这个名称,上下文,数字,部分与数字不直接兼容,这就是为什么你需要投射。

0

其中一个原因是因为当前C#(4.0)不允许您为扩展方法(related question)中的任何类型(包括枚举)编写隐式运算符重载(强制转换)。当与弱类型数据库或弱类型序列化格式(二进制编写器)集成时,将Int16完全转换为/从Int16转换将会很好。