Frage

Dies ist mein Code:

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?

War es hilfreich?

Lösung

Eine Art - werfen 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).

Andere Tipps

Was ist Message.Msg definiert als?

Ich wette es ist Int32.

Ich bin auch WindowsMessagesFlags ist Ihre Art Wetten, aber Nachricht ist aus dem Rahmen.

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

Eine Enumeration ist ein starker Typ, nicht nur eine Zahl , es ist eine Nummer mit einem Namen in einem Kontext . Dieser Name, Kontext-Nummer, Teil mit nur Zahlen nicht direkt kompatibel ist, und das ist, warum Sie werfen müssen.

Ein Grund dafür ist, weil C # zur Zeit (4,0) nicht zulässt, dass eine implizite Betreiber Überlastung (a cast) innerhalb eines Erweiterungsmethode schreiben ( Einschlägige Frage ) für jede Art einer Aufzählung enthält. Es wäre schön, sauber zu / von Int16 zu umwandeln, wenn sie mit einer schwach typisierten Datenbank zum Beispiel oder ein schwach typisierte Serialisierungsformat (binär writer).

Integration
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top