2010-11-18 12 views
6

En C# Tengo un código API "seguro" relacionado con la elevación de UAC. Se trata de conseguir el tamaño de una enumeración (como sigue)C# sizeof (enum) alternative? (al error falso del resharper de la solución)?

int myEnumSize = sizeof (MyEnum); 

El código en sí mismo es válido, compila, funciona correctamente, etc. Pero ReSharper falsamente lo marca como un error ("No se puede utilizar constructo inseguro en contexto seguro") dentro de la solución. (Starting with version 2.0 of C#, applying sizeof to built-in types no longer requires that unsafe mode be used.) Me encanta Resharper, y me encanta el análisis de soluciones, pero con este código en la solución, tengo un gran punto rojo en la esquina que me hace pensar que algo está roto. Si le digo a resharper que ignore este error, vuelve en minutos.

Me gustaría plantear el problema con JetBrains, pero miré en su rastreador y ya tienen un registro que ha sido ignorado desde marzo. Mirando más allá, tienen al menos otras dos instancias de este registro que se remonta a varios años, ambas fueron descartadas con un estado de "no repro". No quiero suscribirme a su rastreador solo para votar este error. Todavía podría terminar aguantando la respiración durante años. El camino más rápido es solo resolver el problema.

¿Cuál es la mejor alternativa que sigue siendo correcta y tiene la menor posibilidad de causar problemas al mantenedor más adelante?

pude difícil que el código a:

int myEnumSize = 4; 

es que hay una solución más correcta? - que no usa sizeof (enum)?

BTW:

Marshal.SizeOf() 

es completamente "seguro", pero devuelve el tamaño incorrecto.

PS. El código en las preguntas está muy influenciado por el código de demostración UACSelfElvation de Microsoft. Si quieres más detalles Pero no creo que sean relevantes.

Respuesta

6

ve feo, pero puede trabajar:

int myEnumSize = Marshal.SizeOf(Enum.GetUnderlyingType(typeof(MyEnum))); 


Editar por John Gietzen:
Prueba:

enum Enum1 : sbyte { A, B, C, D } 
enum Enum2 : short { A, B, C, D } 
enum Enum3 : int { A, B, C, D } 
enum Enum4 : long { A, B, C, D } 

enum Enum5 : byte { A, B, C, D } 
enum Enum6 : ushort { A, B, C, D } 
enum Enum7 : uint { A, B, C, D } 
enum Enum8 : ulong { A, B, C, D } 

sizeof (Enum1): 1
sizeof (Enum2): 2
sizeof (Enum3): 4
sizeof (Enum4): 8
sizeof (Enum5): 1
sizeof (Enum6): 2
sizeof (Enum7): 4
sizeof (Enum8): 8

Marshal.SizeOf (Enum.GetUnderlyingType (typeof (Enum1))): 1
Marshal.SizeOf (Enum.GetUnderlyingType (typeof (Enum2))): 2
Marshal.SizeOf (Enum.GetUnderlyingType (typeof (Enum3))): 4
Marshal.SizeOf (Enum.GetUnderlyingType (typeof (Enum4))): 8
Marshal.SizeOf (Enum.GetUnderlyingType (typeof (Enum5))): 1
Marshal.SizeOf (Enum.GetUnderlyingType (typeof (Enum6))): 2
Marshal.SizeOf (Enum.GetUnderlyingType (typeof (Enum7))): 4
Marshal.SizeOf (Enum.GetUnderlyingType (typeof (Enum8))): 8

+1

Trabajo confirmado. –

+1

Perfecto. Esto es exactamente lo que estaba buscando. Funciona, y aunque no es bonito, con un comentario que muestra la forma más concisa e indicando por qué no se usó aquí, será genial. Gracias. Esto es exactamente lo que estaba esperando cuando le pregunté a Stackoverflow. – DanO

1

La solución correcta sería agregar un comentario antes de esta línea que indique que la advertencia generada por la herramienta es incorrecta. Esto evitará que los futuros mantenedores se confundan y traten de arreglar algo que no está roto.

+0

¿Cómo soluciona esto su problema? –

+0

Si no se soluciona el error en Resharper, realmente no hay una solución, ¿verdad? – cdhowie

+0

No, no hay solución. Pero una solución? tal vez. Eso es lo que está preguntando. –

0

Imagino (si de verdad, realmente lo desea) podría usar un interruptor/caja en la enumeración. Pero mi suposición es que el tamaño está ahí por una razón.

0

Si está interesado en obtener el tamaño del objeto de datos subyacente de la enumeración, quizás una mejor manera sería primero obtener el objeto System.Type.

Type type = typeof (MyEnum); 
int enumSize = sizeof (Enum.GetUnderlyingType (type)); 
0

puede pasar por alto que en ReSharper, pero es un poco de dolor y compromisos/cambia su diseño. Puede poner la definición de Enum y un método para obtener el tamaño (usando sizeof) en una clase en su propio archivo y hacer clic en ReSharper> Opciones ...> Inspección de código> Configuración> Editar elementos para saltar y luego seleccionar ese archivo (I estoy usando R # 5.1).

Obviamente, no obtendrá el análisis del código, pero igual obtendrá la limpieza del formato del código.