2008-11-28 10 views
8

Dies ist mein Code:Warum muss ich enums in C# int deklarieren?

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

Gibt es trotzdem, das Gießen zu verhindern?

Antwort

25

Sortieren von - Guss m.Msg statt:

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

Der Grund, warum Sie die Besetzung überhaupt brauchen, ist, weil in C# Aufzählungen sind nicht nur Zahlen - sie sind Zahlen mit dem Typ zugeordnet. Dies verhindert, dass Sie zu tun (ohne Casting):

HttpStatusCode status = someWindowsMessageFlag; 

Dies ist eindeutig eine gute Sache :) Wenn Sie möchten, können Sie jedoch immer gehen „über“ den zugrunde liegenden Typ (int in diesem Fall).

2

Was ist Message.Msg definiert als?

Ich wette, es ist Int32.

Ich wette auch WindowsMessagesFlags ist Ihr Typ, aber die Nachricht stammt aus dem Framework.

Das bedeutet, dass Sie Ihre eigene enum mit einem Framework-gebauten Objekt verwenden, und natürlich werden sie einige Inkompatibilitäten in Bezug auf Typen haben.

Ein ENUM ist ein starker Typ, nicht nur eine Reihe, es ist eine Nummer mit einem Namen in einem Kontext. Dieser Name, Kontext, Nummer, Teil ist nicht direkt kompatibel mit nur Zahlen, und deshalb müssen Sie umwandeln.

0

Ein Grund ist, weil C# zur Zeit (4.0) nicht erlaubt, eine implizite Operatorüberladung (ein Cast) innerhalb einer Erweiterungsmethode (related question) für einen beliebigen Typ einschließlich einer Enumeration zu schreiben. Es wäre schön, sauber zu/von Int16 zu konvertieren, wenn beispielsweise eine schwach typisierte Datenbank oder ein schwach typisiertes Serialisierungsformat (Binärschreiber) integriert wird.