2008-11-28 85 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轉換將會很好。