Perché devo lanciare enum per int in C #?
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?
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).