2012-08-08 24 views
5

Tengo una enumeración de este tipo en una vieja pieza de código:Tiempo de Compilación La conversión de uint a int en C#

[Flags] 
public enum Example: uint 
{  
    Foo = 0x00000001, 
    Bar = 0xC0000000 
} 

Ahora, FxCop is complaining acerca de esta enumeración utilizando uint en lugar de int, ya que está retrocediendo campo. (Y se me ha encomendado la tarea de hacer que este código sea lo más limpio posible de FxCop ...) Pero existe un valor enum existente que usa el bit de orden alto de la enumeración, y no puedo cambiarlo porque se ha conservado en un formato en disco. Cuando intento compilar esto, el compilador de C# se queja con razón:

error CS0266: Cannot implicitly convert type 'uint' to 'int'. An explicit conversion exists (are you missing a cast?) 

Por lo tanto, yo iba a cambiarlo a este lugar:

[Flags] 
public enum Example 
{  
    Foo = 0x00000001, 
    Bar = (int)0xC0000000 
} 

Sin embargo, no estoy seguro de que puedo confiar en esto no arrojando excepciones aritméticas, o no se manejan correctamente cuando se leen o escriben en el disco. ¿Puedo confiar en el formato de bit aquí que coincide con el formato que usó cuando la enumeración fue respaldada por un int sin firmar?

+0

Esto puede no resolver todos sus problemas FxCop. No me sorprendería si te dijera que debes tener un miembro 'Ninguno' para todas las enumeraciones' [Flags] '. Este parece ser un muy buen lugar para una supresión de advertencia en línea con un comentario sobre por qué no puede cambiar el código. –

+0

@Cody: Sí, podría terminar haciendo eso. –

Respuesta

8

Utilice la palabra clave no marcada aquí y estará bien; el patrón de bit persistente será lo que esperas.

[Flags] 
public enum Example 
{ 
    Foo = 0x00000001, 
    Bar = unchecked((int)0xC0000000); 
} 
0

respuesta de Thomas es 100% correcto, pero voy a añadir mis tres centavos a ella: en lugar de "fijar" el código que ya era correcta, siempre se puede suprimir reglas FxCop por alguna parte del código.

Ver How do I suppress FxCop rule 'DoNotCatchGeneralExceptionTypes' with SupressMessage? y se acepta la respuesta por ejemplo de uso. Todo está configurado en el código y .csproj, de modo que todas las configuraciones de supresión se mantienen con el código cuando se entregan al cliente final.

+0

FxCop está ahí para encontrar cosas "correctas" que son malas ideas. Si suprimo todo, un poco derrota el punto. (Para ser claros, con "lo más limpio posible de FxCop", lo que estoy haciendo es pasar por nuestras supresiones y eliminarlas) –

+1

Mi comentario anterior era una tontería. Lo que intentaba decir es que .Net está lleno de supresiones de FxCop, compruébalo tú mismo. Casi para cada regla hay un caso en el que la regla es "generalmente correcta" pero realmente no deseada. Creo que su compatibilidad con el almacenamiento subyacente es el caso. Por supuesto, a menos que su enumeración y asamblea no se hayan usado en idiomas que no tengan "unsigned" s. De todos modos, si tienes que hacerlo, hazlo :) La respuesta de Thomas es genial. Acabo de agregar el mío para completarlo. – quetzalcoatl