Domanda

Questo è il mio codice:

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

Esiste un modo per impedire il casting?

È stato utile?

Soluzione

Sorta di - cast m.Msg invece:

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

Il motivo per cui hai bisogno del cast è perché in C # le enumerazioni non sono solo numeri, sono numeri associati al tipo. Questo ti impedisce di farlo (senza casting):

HttpStatusCode status = someWindowsMessageFlag;

Questa è chiaramente una buona cosa :) Quando è necessario, tuttavia, puoi sempre andare " tramite " il tipo sottostante (int in questo caso).

Altri suggerimenti

Cosa viene definito Message.Msg come?

Scommetto che è Int32.

Scommetto anche che WindowsMessagesFlags è il tuo tipo, ma Message è dal framework.

Il che significa che stai usando il tuo enum con un oggetto costruito in un framework, e ovviamente avranno delle incompatibilità riguardo ai tipi.

Un enum è un tipo forte, non solo un numero , è un numero con un nome in un contesto . Questo nome, contesto, numero, parte non è direttamente compatibile con solo numeri, ed è per questo che devi lanciare.

Uno dei motivi è che C # attualmente (4.0) non consente di scrivere un sovraccarico operatore implicito (un cast) all'interno di un metodo di estensione ( domanda correlata ) per qualsiasi tipo inclusa un'enumerazione. Sarebbe bello convertirlo in modo pulito in / da Int16 durante l'integrazione con un database debolmente tipizzato, ad esempio o un formato di serializzazione debolmente tipizzato (binary writer).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top