tipos referencia objeto instancia establecida error datos como c# interop

referencia - tipos de datos en c# pdf



Mejor forma de lanzar el objeto a int (8)

Esto es probablemente trivial, pero no puedo pensar en una mejor manera de hacerlo. Tengo un objeto COM que devuelve una variante que se convierte en un objeto en C #. La única forma en que puedo conseguir esto en un int es

int test = int.Parse(string.Format("{0}", myobject))

¿Hay una manera más limpia de hacer esto? Gracias


El objeto mundillo (int) debería funcionar.

Si eso le da una excepción de conversión inválida, es probable que sea porque el tipo de variante no es VT_I4. Mi apuesta es que una variante con VT_I4 se convierte en un int en caja, VT_I2 en un corto en caja, etc.

Al hacer un yeso en un tipo de valor encuadrado, solo es válido para convertirlo en el tipo encuadrado. Por ejemplo, si la variante devuelta es realmente un VT_I2, entonces (int) (corto) myObject debería funcionar.

La forma más sencilla de averiguarlo es inspeccionar el objeto devuelto y echar un vistazo a su tipo en el depurador. También asegúrese de que en el conjunto de interoperabilidad tenga el valor de retorno marcado con MarshalAs (UnmanagedType.Struct)


Estoy enumerando la diferencia en cada una de las formas de lanzamiento. ¿Qué tipo particular de casting maneja y no?

// object to int // does not handle null // does not handle NAN ("102art54") // convert value to integar int intObj = (int)obj; // handles only null or number int? nullableIntObj = (int?)obj; // null Nullable<int> nullableIntObj1 = (Nullable<int>)obj; // null // best way for casting from object to nullable int // handles null // handles other datatypes gives null("sadfsdf") // result null int? nullableIntObj2 = obj as int?; // string to int // does not handle null( throws exception) // does not string NAN ("102art54") (throws exception) // converts string to int ("26236") // accepts string value int iVal3 = int.Parse("10120"); // throws exception value cannot be null; // handles null converts null to 0 // does not handle NAN ("102art54") (throws exception) // converts obj to int ("26236") int val4 = Convert.ToInt32("10120"); // handle null converts null to 0 // handle NAN ("101art54") converts null to 0 // convert string to int ("26236") int number; bool result = int.TryParse(value, out number); if (result) { // converted value } else { // number o/p = 0 }



También hay TryParse .

Desde MSDN:

private static void TryToParse(string value) { int number; bool result = Int32.TryParse(value, out number); if (result) { Console.WriteLine("Converted ''{0}'' to {1}.", value, number); } else { if (value == null) value = ""; Console.WriteLine("Attempted conversion of ''{0}'' failed.", value); } }


Tienes varias opciones:

  • (int) - Operador de reparto. Funciona si el objeto ya es un entero en algún nivel en 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 IConvertible si se define alguna.

  • as int? - Nota la "?". El operador as es solo para tipos de referencia, y entonces usé "?" para significar un Nullable<int> . El operador " as " funciona como Convert.To____() , pero piensa TryParse() lugar de Parse() : devuelve null lugar de arrojar una excepción si la conversión falla.

De estos, preferiría (int) si el objeto realmente es solo un número entero encuadrado. De lo contrario, use Convert.ToInt32() en este caso.

Tenga en cuenta que esta es una respuesta muy general : quiero prestarle atención a la respuesta de Darren Clark porque creo que hace un buen trabajo al abordar los detalles aquí, pero llegó tarde y todavía no se votó. Obtiene mi voto para "respuesta aceptada", de todos modos, para también recomendar (int), para señalar que si falla (int)(short) podría funcionar en su lugar, y para recomendar que revise su depurador para averiguar el tipo de tiempo de ejecución real .


Use Int32.TryParse siguiente manera.

int test; bool result = Int32.TryParse(value, out test); if (result) { Console.WriteLine("Sucess"); } else { if (value == null) value = ""; Console.WriteLine("Failure"); }


Convert.ToInt(myobject);

Esto manejará el caso donde myobject es null y devuelve 0 , en lugar de lanzar una excepción.


var intTried = Convert.ChangeType(myObject, typeof(int)) as int?;