Tienes varias opciones:
(int)
- Operador de reparto. Funciona si el objeto ya es un número entero en algún nivel de la jerarquía de herencia o si hay una conversión implícita definida.
int.Parse()/int.TryParse()
- Para convertir desde una cadena de formato desconocido.
int.ParseExact()/int.TryParseExact()
- Para convertir desde una cadena en un formato específico
Convert.ToInt32()
- Para convertir un objeto de tipo desconocido. Utilizará una conversión explícita e implícita o una implementación de IConvertible si hay alguna definida.
as int?
- Nota la "?". El as
operador es solo para tipos de referencia, así que usé "?" significar a Nullable<int>
. El " as
" operador funciona como Convert.To____()
, pero piensa en TryParse()
lugar de Parse()
: regresa en null
lugar de lanzar una excepción si la conversión falla.
De estos, preferiría (int)
si el objeto realmente es solo un entero en caja. De lo contrario, use Convert.ToInt32()
en este caso.
Tenga en cuenta que esta es una respuesta muy general : quiero llamar la atención sobre la respuesta de Darren Clark porque creo que hace un buen trabajo al abordar los detalles aquí, pero llegó tarde y todavía no fue votado. De todos modos, obtiene mi voto para "respuesta aceptada", también por recomendar (int), señalar que si falla (int)(short)
podría funcionar en su lugar, y por recomendarle que verifique su depurador para averiguar el tipo de tiempo de ejecución real.
El elenco
(int) myobject
debería funcionar.Si eso le da una excepción de conversión no válida, probablemente se deba a que el tipo de variante no es VT_I4. Mi apuesta es que una variante con VT_I4 se convierte en un cuadro int, VT_I2 en un cuadro corto, etc.
Al realizar una conversión en un tipo de valor en recuadro, solo es válido emitirlo en el tipo encuadrado. Ejemplo de enemigo, si la variante devuelta es en realidad un VT_I2, entonces
(int) (short) myObject
debería funcionar.La forma más fácil de averiguarlo es inspeccionar el objeto devuelto y observar su tipo en el depurador. También asegúrese de que en el ensamblaje de interoperabilidad tenga el valor de retorno marcado con
MarshalAs(UnmanagedType.Struct)
fuente
Convert.ToInt32 (myobject);
esto manejará el caso donde myobject es nulo y devolverá 0, en lugar de lanzar una excepción.
fuente
ToInt32
.Use de la
Int32.TryParse
siguiente manera.fuente
Estoy enumerando la diferencia en cada una de las formas de casting. ¿Qué tipo particular de fundición maneja y no maneja?
fuente
Quizás Convert.ToInt32 .
Cuidado con la excepción, en ambos casos.
fuente
fuente
Convert.ChangeType
. Diría que podría no ser la respuesta perfecta para OP, ¡pero definitivamente es útil para algunos!También hay TryParse .
De MSDN:
fuente
Es extraño, pero la respuesta aceptada parece incorrecta sobre el elenco y la conversión en el sentido de que, a partir de mis pruebas y la lectura de la documentación, no debería tener en cuenta los operadores implícitos o explícitos.
Entonces, si tengo una variable de tipo objeto y la clase "en caja" tiene algunos operadores implícitos definidos, no funcionarán.
En cambio, otra forma simple, pero realmente el costo del rendimiento es lanzar antes en forma dinámica.
(int) (dinámico) myObject.
Puede probarlo en la ventana interactiva de VS.
fuente
dynamic
está lejos de ser gratuitofuente