2010-08-30 8 views
7

Tengo una object o que se sabe que es una caja int o uint:Unboxing uint/int sin saber lo que hay dentro de la caja de

object o = int.MinValue 
object o = (uint)int.MinValue // same bytes as above 

no sé lo que hay en la caja, lo único que importa es que hay 4 bytes allí que quiero forzar a un int o uint. Esto funciona bien en un contexto unchecked cuando tengo los valores (en lugar de cajas):

unchecked 
{ 
    int a = (int)0x80000000u; // will be int.MinValue, the literal is a uint 
    uint b = (uint)int.MinValue; 
} 

Nota: Por defecto todo en C# no está marcada, el contexto sin control sólo es necesario aquí porque estamos tratando con literales y el compilador quiere saber si realmente queremos dispararnos en el pie.

El problema ahora es que no sé qué hay dentro de la caja (además de que es de 4 bytes), pero el tiempo de ejecución lo hace cuando intento desempaquetar el tipo equivocado obtengo un InvalidCastException. Sé que este es un comportamiento de tiempo de ejecución razonable, pero en este caso sé lo que estoy haciendo y quiero un "unbox desactivado". Algo como eso existe?

Sé que podría catch y vuelva a intentar, por lo que no cuenta como una respuesta.

Respuesta

4

Puede usar Convert.ToInt32 para convertir cualquier objeto a un int si es posible, aunque también hará la conversión o el análisis, por lo que puede ser más lento de lo que desee.

Si usted sabe que es un int o uint, usted puede hacer esto:

int x = (o is int) ? (int)o : (int)(uint)o; 
+0

Convertir plantea excepciones de desbordamiento (necesito la coacción sin marcar). Sin embargo, es una buena idea verificar el contenido de la caja, esperando que haya una mejor solución. –

+0

@Johannes: puede hacer 'unchecked ((uint) Convert.ToInt64 (o))' para evitar la excepción convirtiendo a un tamaño más grande, aunque si alguna vez necesitó trabajar en enteros de 64 bits, no tendría un tamaño más grande para hacer eso con. – Quartermeister

Cuestiones relacionadas