Este artículo se tradujo automáticamente. Para ver el artículo en inglés, active la casilla Inglés. Además, puede mostrar el texto en inglés en una ventana emergente si mueve el puntero del mouse sobre el texto.
Traducción
Inglés

Clase InvalidCastException

 

Publicado: octubre de 2016

Excepción que se produce cuando la conversión no es válida o es explícita.

Espacio de nombres:   System
Ensamblado:  mscorlib (en mscorlib.dll)

System.Object
  System.Exception
    System.SystemException
      System.InvalidCastException

[SerializableAttribute]
[ComVisibleAttribute(true)]
public class InvalidCastException : SystemException

NombreDescripción
System_CAPS_pubmethodInvalidCastException()

Inicializa una nueva instancia de la clase InvalidCastException.

System_CAPS_protmethodInvalidCastException(SerializationInfo, StreamingContext)

Inicializa una nueva instancia de la clase InvalidCastException con datos serializados.

System_CAPS_pubmethodInvalidCastException(String)

Inicializa una nueva instancia de la clase InvalidCastException con el mensaje de error especificado.

System_CAPS_pubmethodInvalidCastException(String, Exception)

Inicializa una nueva instancia de la clase InvalidCastException con el mensaje de error especificado y una referencia a la excepción interna que representa la causa de esta excepción.

System_CAPS_pubmethodInvalidCastException(String, Int32)

Inicializa una nueva instancia de la InvalidCastException clase con un código de error y de mensaje especificado.

NombreDescripción
System_CAPS_pubpropertyData

Obtiene una colección de pares clave-valor que proporcionan más información definida por el usuario sobre la excepción.(Heredado de Exception).

System_CAPS_pubpropertyHelpLink

Obtiene o establece un vínculo al archivo de ayuda asociado a esta excepción.(Heredado de Exception).

System_CAPS_pubpropertyHResult

Obtiene o establece HRESULT, un valor numérico codificado que se asigna a una excepción específica.(Heredado de Exception).

System_CAPS_pubpropertyInnerException

Obtiene la instancia Exception que produjo la excepción actual.(Heredado de Exception).

System_CAPS_pubpropertyMessage

Obtiene un mensaje que describe la excepción actual.(Heredado de Exception).

System_CAPS_pubpropertySource

Devuelve o establece el nombre de la aplicación o del objeto que generó el error.(Heredado de Exception).

System_CAPS_pubpropertyStackTrace

Obtiene una representación de cadena de los marcos inmediatos en la pila de llamadas.(Heredado de Exception).

System_CAPS_pubpropertyTargetSite

Obtiene el método que produjo la excepción actual.(Heredado de Exception).

NombreDescripción
System_CAPS_pubmethodEquals(Object)

Determina si el objeto especificado es igual al objeto actual.(Heredado de Object).

System_CAPS_protmethodFinalize()

Permite que un objeto intente liberar recursos y realizar otras operaciones de limpieza antes de ser reclamado por el recolector de basura. (Heredado de Object).

System_CAPS_pubmethodGetBaseException()

Cuando se invalida en una clase derivada, devuelve la clase Exception que representa la causa principal de una o más excepciones posteriores.(Heredado de Exception).

System_CAPS_pubmethodGetHashCode()

Sirve como la función hash predeterminada.(Heredado de Object).

System_CAPS_pubmethodGetObjectData(SerializationInfo, StreamingContext)

Cuando se invalida en una clase derivada, establece SerializationInfo con información sobre la excepción.(Heredado de Exception).

System_CAPS_pubmethodGetType()

Obtiene el tipo en tiempo de ejecución de la instancia actual.(Heredado de Exception).

System_CAPS_protmethodMemberwiseClone()

Crea una copia superficial del Object actual.(Heredado de Object).

System_CAPS_pubmethodToString()

Crea y devuelve una representación de cadena de la excepción actual.(Heredado de Exception).

NombreDescripción
System_CAPS_proteventSerializeObjectState

Ocurre cuando una excepción se serializa para crear un objeto de estado de excepción que contenga datos serializados sobre la excepción.(Heredado de Exception).

.NET Framework admite la conversión automática de tipos derivados a sus tipos bases y al tipo derivado, así como de tipos que presentan interfaces para objetos de interfaz y realizar copias. También incluye una variedad de mecanismos que admiten las conversiones personalizadas. Para obtener más información, consulta Conversión de tipos en .NET Framework.

Un InvalidCastException excepción se produce cuando no se admite la conversión de una instancia de un tipo a otro tipo. Por ejemplo, al intentar convertir una Char valor a un DateTime valor produce un InvalidCastException excepción. Difiere de un OverflowException excepción que se produce cuando se admite una conversión de un tipo a otro, pero el valor del tipo de origen está fuera del intervalo del tipo de destino. Un InvalidCastException excepción se produce por error de desarrollador y no debe tratarse de un try/catch bloque; en su lugar, debe eliminarse la causa de la excepción.

Para obtener información sobre las conversiones compatibles con el sistema, consulte la Convert clase. Para errores que se producen cuando el tipo de destino puede almacenar valores del tipo de origen, pero no es grande suficiente para almacenar valores específicos del origen, consulte el OverflowException excepción.

System_CAPS_noteNota

En muchos casos, el compilador del lenguaje detecta que ninguna conversión entre el tipo de origen y el tipo de destino y emite un error del compilador.

Algunas de las condiciones en las que se produce un intento de conversión un InvalidCastException excepción se tratan en las secciones siguientes:

Los tipos primitivos y IConvertible
El método Convert.ChangeType
Las conversiones de restricción e implementaciones de IConvertible
Convertir a tipo heredado
Conversión de un objeto de interfaz
Conversiones de cadenas
Migración de Visual Basic 6.0

Para que una conversión de referencia explícita sea correcta, el valor de origen debe ser null, o el tipo de objeto al que hace referencia el argumento de origen debe poder convertirse al tipo de destino mediante una conversión de referencia implícita.

Las siguientes instrucciones de lenguaje intermedio (IL) producen un InvalidCastException excepción:

  • castclass

  • refanyval

  • unbox

InvalidCastException utiliza HRESULT COR_E_INVALIDCAST, que tiene el valor 0 x 80004002.

Para obtener una lista de valores de propiedad iniciales de una instancia de InvalidCastException, consulte el InvalidCastException constructores.

Directa o indirectamente llamar a un tipo primitivo IConvertible implementación que no admite una conversión determinada. Por ejemplo, al intentar convertir una Boolean valor a un Char o un DateTime valor a un Int32 produce una InvalidCastException excepción. En el ejemplo siguiente se llama a ambos el Boolean.IConvertible.ToChar y Convert.ToChar(Boolean) métodos para convertir un Boolean valor a un Char. En ambos casos, la llamada al método produce un InvalidCastException excepción.

using System;

public class Example
{
   public static void Main()
   {
      bool flag = true;
      try {
         IConvertible conv = flag;
         Char ch = conv.ToChar(null);
         Console.WriteLine("Conversion succeeded.");
      }   
      catch (InvalidCastException) {   
         Console.WriteLine("Cannot convert a Boolean to a Char.");
      }

      try {
         Char ch = Convert.ToChar(flag);
         Console.WriteLine("Conversion succeeded.");
      }   
      catch (InvalidCastException) {   
         Console.WriteLine("Cannot convert a Boolean to a Char.");
      }
   }
}
// The example displays the following output:
//       Cannot convert a Boolean to a Char.
//       Cannot convert a Boolean to a Char.

Porque no se admite la conversión, no hay ninguna solución alternativa.

Se ha llamado a la Convert.ChangeType no implementan el método para convertir un objeto de un tipo a otro, pero uno o ambos tipos de la IConvertible interfaz.

En la mayoría de los casos, porque no se admite la conversión, no hay ninguna solución alternativa. En algunos casos, una posible solución consiste en asignar manualmente los valores de propiedad del tipo de origen a propiedades similares de un tipo de destino.

Operadores de restricción definen las conversiones explícitas que admite un tipo. Un operador de conversión en C# o la CType método de conversión de Visual Basic (si Option Strict está en) es necesario para realizar la conversión.

Sin embargo, si el tipo de origen ni el tipo de destino define explícita o conversión entre los dos tipos de restricción y la IConvertible implementación de uno o ambos tipos no admite una conversión del tipo de origen al tipo de destino, un InvalidCastException excepción.

En la mayoría de los casos, porque no se admite la conversión, no hay ninguna solución alternativa.

Va a convertir a tipo heredado, es decir, intentar convertir una instancia de un tipo base a uno de sus tipos derivados. En el ejemplo siguiente, se intenta convertir un Person de objeto para un PersonWithID se produce un error de objeto.

using System;

public class Person
{
   String _name;

   public String Name 
   { 
      get { return _name; }
      set { _name = value; }
   }
}

public class PersonWithId : Person
{
   String _id;

   public string Id
   {
      get { return _id; }
      set { _id = value; }
   }
}

public class Example
{
   public static void Main()
   {
      Person p = new Person();
      p.Name = "John";
      try {
         PersonWithId pid = (PersonWithId) p;
         Console.WriteLine("Conversion succeeded.");
      }   
      catch (InvalidCastException) {
         Console.WriteLine("Conversion failed.");
      } 

      PersonWithId pid1 = new PersonWithId();
      pid1.Name = "John";
      pid1.Id = "246";
      Person p1 = pid1;
      try {   
         PersonWithId pid1a = (PersonWithId) p1;
         Console.WriteLine("Conversion succeeded.");
      }   
      catch (InvalidCastException) {
         Console.WriteLine("Conversion failed.");
      } 

      Person p2 = null;
      try {   
         PersonWithId pid2 = (PersonWithId) p2;
         Console.WriteLine("Conversion succeeded.");
      }   
      catch (InvalidCastException) {
         Console.WriteLine("Conversion failed.");
      } 
   }
}
// The example displays the following output:
//       Conversion failed.
//       Conversion succeeded.
//       Conversion succeeded.

Como se muestra en el ejemplo, la conversión en tipos inferiores se realiza correctamente sólo si la Person objeto fue creado por una conversión hacia arriba desde un PersonWithId de objeto para un Person objeto, o si la Person objeto es null.

Intenta convertir un objeto de interfaz a un tipo que implementa esa interfaz, pero el tipo de destino no es del mismo tipo o una clase base del tipo desde el que se derivó originalmente el objeto de interfaz. En el ejemplo siguiente se inicia una InvalidCastException excepción cuando se intenta convertir un IFormatProvider de objeto para un DateTimeFormatInfo objeto. La conversión se produce un error porque aunque el DateTimeFormatInfo la clase implementa la IFormatProvider interfaz, la DateTimeFormatInfo objeto no está relacionado con la CultureInfo del que se deriva el objeto de interfaz de clase.

using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      var culture = CultureInfo.InvariantCulture;
      IFormatProvider provider = culture;

      DateTimeFormatInfo dt = (DateTimeFormatInfo) provider;
   }
}
// The example displays the following output:
//    Unhandled Exception: System.InvalidCastException: 
//       Unable to cast object of type //System.Globalization.CultureInfo// to 
//           type //System.Globalization.DateTimeFormatInfo//.
//       at Example.Main()

Como excepción mensaje indica, la conversión se realizaría correctamente sólo si el objeto de interfaz se convierte en una instancia del tipo original, en este caso un CultureInfo. La conversión también se realizará correctamente si el objeto de interfaz se convierte en una instancia de un tipo base del tipo original.

Intenta convertir un valor o un objeto en su representación de cadena mediante un operador de conversión en C#. En el ejemplo siguiente, tanto el intento de convertir un Char valor en una cadena y el intento de convertir un entero a cadena throw un InvalidCastException excepción.

using System;

public class Example
{
   public static void Main()
   {
      object value = 12;
      // Cast throws an InvalidCastException exception.
      string s = (string) value;
   }
}
System_CAPS_noteNota

Con Visual Basic CStr para convertir un valor de un tipo primitivo a una cadena se realiza correctamente. La operación no produce un InvalidCastException excepción.

Correctamente convertir una instancia de cualquier tipo en su representación de cadena, llame a su ToString método, como en el ejemplo siguiente se realiza. El ToString método siempre está presente, desde el ToString método se define mediante el Object de clase y, por tanto, es heredado o se reemplaza por todos los tipos administrados.

using System;

public class Example
{
   public static void Main()
   {
      object value = 12;
      string s = value.ToString();
      Console.WriteLine(s);
   }
}
// The example displays the following output:
//      12

Una aplicación de Visual Basic 6.0 con una llamada a un evento personalizado en un control de usuario se actualiza a Visual Basic. NET y un InvalidCastException excepción con el mensaje, "la conversión especificada no es válida." Para evitar esta excepción, cambie la línea de código en el formulario (como Form1)

Call UserControl11_MyCustomEvent(UserControl11, New UserControl1.MyCustomEventEventArgs(5))

y reemplácela con la siguiente línea de código:

Call UserControl11_MyCustomEvent(UserControl11(0), New UserControl1.MyCustomEventEventArgs(5))

Plataforma universal de Windows
Disponible desde 8
.NET Framework
Disponible desde 1.1
Biblioteca de clases portable
Se admite en: plataformas portátiles de .NET
Silverlight
Disponible desde 2.0
Windows Phone Silverlight
Disponible desde 7.0
Windows Phone
Disponible desde 8.1

Cualquier miembro ( Compartido en Visual Basic) estático público de este tipo es seguro para subprocesos. No se garantiza que los miembros de instancia sean seguros para subprocesos.

Volver al principio
Mostrar: