Por que eu tenho que enums elenco para int em C #?
Pergunta
Este é meu código:
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;
}
}
Existe uma maneira de evitar o vazamento?
Solução
Mais ou menos - elenco m.Msg vez:
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;
}
}
A razão que você precisa o elenco em tudo é porque em C # enums não são apenas números - eles são os números associados ao tipo. Isso você impede de fazer (sem vazamento):
HttpStatusCode status = someWindowsMessageFlag;
Esta é claramente uma coisa boa :) Quando você precisa, no entanto, você pode sempre ir "via" o tipo subjacente (int neste caso).
Outras dicas
O que é Message.Msg definido como?
Eu estou apostando que é Int32.
Eu também estou apostando WindowsMessagesFlags é o seu tipo, mas a mensagem é a partir do quadro.
O que significa que você está usando seu próprio enum com um objeto embutido quadro, e é claro que eles vão ter algumas incompatibilidades em relação a tipos.
Uma enumeração é um tipo forte, não apenas um número , é uma número com um nome em um contexto . Este nome, contexto, número, parte não é diretamente compatível com números apenas, e é por isso que você precisa elenco.
Uma das razões é porque C # atualmente (4.0) não permite que você escreva uma sobrecarga implícito operador (um elenco) dentro de um método de extensão ( pergunta relacionada ) para qualquer tipo incluindo uma enumeração. Seria bom para converter limpa de / para Int16 ao integrar com um banco de dados fracamente tipado por exemplo, ou um formato de serialização fracamente tipado (escritor binário).