InvalidCastException InvalidCastException InvalidCastException InvalidCastException Class

Definición

Excepción que se produce para una conversión de tipo o una conversión explícita de otra naturaleza que no es válida.The exception that is thrown for invalid casting or explicit conversion.

public ref class InvalidCastException : SystemException
[System.Runtime.InteropServices.ComVisible(true)]
[System.Serializable]
public class InvalidCastException : SystemException
type InvalidCastException = class
    inherit SystemException
Public Class InvalidCastException
Inherits SystemException
Herencia
InvalidCastExceptionInvalidCastExceptionInvalidCastExceptionInvalidCastException
Atributos

Comentarios

.NET Framework admite los tipos derivados en sus tipos base y de vuelta a tipo derivado, así como de tipos que presentan las interfaces para objetos de interfaz y hacer una copia de la conversión automática.The .NET Framework supports automatic conversion from derived types to their base types and back to the derived type, as well as from types that present interfaces to interface objects and back. También incluye una variedad de mecanismos que permitan utilizar conversiones personalizadas.It also includes a variety of mechanisms that support custom conversions. Para obtener más información, consulte conversión de tipos en .NET Framework.For more information, see Type Conversion in the .NET Framework.

Un InvalidCastException excepción se produce cuando no se admite la conversión de una instancia de un tipo a otro tipo.An InvalidCastException exception is thrown when the conversion of an instance of one type to another type is not supported. Por ejemplo, intenta convertir un Char valor a un DateTime valor produce un InvalidCastException excepción.For example, attempting to convert a Char value to a DateTime value throws an InvalidCastException exception. 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.It differs from an OverflowException exception, which is thrown when a conversion of one type to another is supported, but the value of the source type is outside the range of the target type. Un InvalidCastException excepción se produce por error de desarrollador y no se deben administrar en un try/catch bloquear; en su lugar, debe eliminarse la causa de la excepción.An InvalidCastException exception is caused by developer error and should not be handled in a try/catch block; instead, the cause of the exception should be eliminated.

Para obtener información sobre las conversiones compatibles con el sistema, consulte el Convert clase.For information about conversions supported by the system, see the Convert class. Los errores que se producen cuando el tipo de destino puede almacenar valores del tipo de origen, pero no es grande suficiente para almacenar un valor de origen específico, vea el OverflowException excepción.For errors that occur when the destination type can store source type values, but is not large enough to store a specific source value, see the OverflowException exception.

Nota

En muchos casos, el compilador del lenguaje detecta que no hay conversión existe entre el tipo de origen y el tipo de destino y emite un error del compilador.In many cases, your language compiler detects that no conversion exists between the source type and the target type and issues a compiler error.

Algunas de las condiciones en las que se produce un intento de conversión un InvalidCastException excepción se tratan en las secciones siguientes:Some of the conditions under which an attempted conversion throws an InvalidCastException exception are discussed in the following sections:

Los tipos primitivos y IConvertible Primitive types and IConvertible
El método Convert.ChangeType The Convert.ChangeType method
Las conversiones de restricción e implementaciones de IConvertible Narrowing conversions and IConvertible implementations
Convertir Downcasting
Conversión de un objeto de interfaz Conversion from an interface object
Conversiones de cadenas String conversions
Migración de Visual Basic 6.0Visual Basic 6.0 migration

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 implícita de referencia.For an explicit reference conversion to be successful, the source value must be null, or the object type referenced by the source argument must be convertible to the destination type by an implicit reference conversion.

Las siguientes instrucciones de lenguaje intermedio (IL) producen un InvalidCastException excepción:The following intermediate language (IL) instructions throw an InvalidCastException exception:

  • castclass

  • refanyval

  • unbox

InvalidCastException utiliza HRESULT COR_E_INVALIDCAST, que tiene el valor 0 x 80004002.InvalidCastException uses the HRESULT COR_E_INVALIDCAST, which has the value 0x80004002.

Para obtener una lista de valores de propiedad iniciales de una instancia de InvalidCastException, consulte el InvalidCastException constructores.For a list of initial property values for an instance of InvalidCastException, see the InvalidCastException constructors.

Los tipos primitivos y IConvertiblePrimitive types and IConvertible

Directa o indirectamente llamar a un tipo primitivo IConvertible implementación que no admite una conversión determinada.You directly or indirectly call a primitive type's IConvertible implementation that does not support a particular conversion. Por ejemplo, intenta convertir un Boolean valor a un Char o un DateTime valor a un Int32 produce una InvalidCastException excepción.For example, trying to convert a Boolean value to a Char or a DateTime value to an Int32 throws an InvalidCastException exception. El ejemplo siguiente se llama a la Boolean.IConvertible.ToChar y Convert.ToChar(Boolean) métodos para convertir un Boolean valor a un Char.The following example calls both the Boolean.IConvertible.ToChar and Convert.ToChar(Boolean) methods to convert a Boolean value to a Char. En ambos casos, la llamada al método produce una InvalidCastException excepción.In both cases, the method call throws an InvalidCastException exception.

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.
Module Example
   Public Sub Main()
      Dim flag As Boolean = True
      Try
         Dim conv As IConvertible = flag
         Dim ch As Char = conv.ToChar(Nothing)
         Console.WriteLine("Conversion succeeded.")
      Catch e As InvalidCastException   
         Console.WriteLine("Cannot convert a Boolean to a Char.")
      End Try
      
      Try
         Dim ch As Char = Convert.ToChar(flag)
         Console.WriteLine("Conversion succeeded.")
      Catch e As InvalidCastException   
         Console.WriteLine("Cannot convert a Boolean to a Char.")
      End Try
   End Sub
End Module
' The example displays the following output:
'       Cannot convert a Boolean to a Char.
'       Cannot convert a Boolean to a Char.

Dado que no se admite la conversión, no hay ninguna solución alternativa.Because the conversion is not supported, there is no workaround.

El método Convert.ChangeTypeThe Convert.ChangeType method

Ha llamado el Convert.ChangeType no implementan el método para convertir un objeto de un tipo a otro, pero uno o ambos tipos el IConvertible interfaz.You've called the Convert.ChangeType method to convert an object from one type to another, but one or both types don't implement the IConvertible interface.

En la mayoría de los casos, porque no se admite la conversión, hay ninguna solución alternativa.In most cases, because the conversion is not supported, there is no workaround. En algunos casos, una posible solución consiste en asignar manualmente los valores de propiedad del tipo de origen a las propiedades similares de un tipo de destino.In some cases, a possible workaround is to manually assign property values from the source type to similar properties of a the target type.

Las conversiones de restricción e implementaciones de IConvertibleNarrowing conversions and IConvertible implementations

Operadores de restricción definen las conversiones explícitas compatibles con un tipo.Narrowing operators define the explicit conversions supported by a type. Un operador de conversión en C# o la CType método de conversión de Visual Basic (si Option Strict está activado) es necesario para realizar la conversión.A casting operator in C# or the CType conversion method in Visual Basic (if Option Strict is on) is required to perform the conversion.

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 no admite la implementación de uno o ambos tipos de una conversión del tipo de origen al tipo de destino, un InvalidCastExceptiones una excepción.However, if neither the source type nor the target type defines an explicit or narrowing conversion between the two types, and the IConvertible implementation of one or both types doesn't support a conversion from the source type to the target type, an InvalidCastException exception is thrown.

En la mayoría de los casos, porque no se admite la conversión, hay ninguna solución alternativa.In most cases, because the conversion is not supported, there is no workaround.

ConvertirDowncasting

Va a convertir, es decir, intenta convertir una instancia de un tipo base en uno de sus tipos derivados.You are downcasting, that is, trying to convert an instance of a base type to one of its derived types. En el ejemplo siguiente, intenta convertir un Person objeto a un PersonWithID se produce un error de objeto.In the following example, trying to convert a Person object to a PersonWithID object fails.

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.
Public Class Person
   Dim _name As String
   
   Public Property Name As String
      Get
         Return _name
      End Get
      Set
         _name = value
      End Set
   End Property
End Class

Public Class PersonWithID : Inherits Person
   Dim _id As String
   
   Public Property Id As String
      Get
         Return _id
      End Get
      Set
         _id = value
      End Set
   End Property
End Class

Module Example
   Public Sub Main()
      Dim p As New Person()
      p.Name = "John"
      Try
         Dim pid As PersonWithId = CType(p, PersonWithId)
         Console.WriteLine("Conversion succeeded.")
      Catch e As InvalidCastException
         Console.WriteLine("Conversion failed.")
      End Try 
      
      Dim pid1 As New PersonWithId()
      pid1.Name = "John"
      pid1.Id = "246"
      Dim p1 As Person = pid1
      
      Try   
         Dim pid1a As PersonWithId = CType(p1, PersonWithId)
         Console.WriteLine("Conversion succeeded.")
      Catch e As InvalidCastException
         Console.WriteLine("Conversion failed.")
      End Try 
      
      Dim p2 As Person = Nothing
      Try   
         Dim pid2 As PersonWithId = CType(p2, PersonWithId)
         Console.WriteLine("Conversion succeeded.")
      Catch e As InvalidCastException
         Console.WriteLine("Conversion failed.")
      End Try 
   End Sub
End Module
' The example displays the following output:
'       Conversion failed.
'       Conversion succeeded.
'       Conversion succeeded.

Como se muestra en el ejemplo, la conversión se realiza correctamente sólo si el Person objeto fue creado por una conversión hacia arriba de un PersonWithId objeto a un Person objeto, o si el Person objeto es null.As the example shows, the downcast succeeds only if the Person object was created by an upcast from a PersonWithId object to a Person object, or if the Person object is null.

Conversión de un objeto de interfazConversion from an interface object

Intenta convertir un objeto de interfaz en un tipo que implementa esa interfaz, pero el tipo de destino no es el mismo tipo o una clase base del tipo del que se derivó originalmente el objeto de interfaz.You are attempting to convert an interface object to a type that implements that interface, but the target type is not the same type or a base class of the type from which the interface object was originally derived. En el ejemplo siguiente se inicia un InvalidCastException excepción cuando intenta convertir un IFormatProvider objeto a un DateTimeFormatInfo objeto.The following example throws an InvalidCastException exception when it attempts to convert an IFormatProvider object to a DateTimeFormatInfo object. La conversión produce un error porque aunque el DateTimeFormatInfo la clase implementa la IFormatProvider interfaz, el DateTimeFormatInfo objeto no está relacionado con la CultureInfo desde que se obtuvo el objeto de interfaz de clase.The conversion fails because although the DateTimeFormatInfo class implements the IFormatProvider interface, the DateTimeFormatInfo object is not related to the CultureInfo class from which the interface object was derived.

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()
Imports System.Globalization

Module Example
   Public Sub Main()
      Dim culture As CultureInfo = CultureInfo.InvariantCulture
      Dim provider As IFormatProvider = culture
      
      Dim dt As DateTimeFormatInfo = CType(provider, DateTimeFormatInfo)
   End Sub
End Module
' 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()

Indica que la excepción mensaje, la conversión se realizaría correctamente solo si el objeto de interfaz se convierte a una instancia del tipo original, en este caso un CultureInfo.As the exception message indicates, the conversion would succeed only if the interface object is converted back to an instance of the original type, in this case a 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.The conversion would also succeed if the interface object is converted to an instance of a base type of the original type.

Conversiones de cadenasString conversions

Intenta convertir un valor o un objeto en su representación de cadena mediante un operador de conversión en C#.You are trying to convert a value or an object to its string representation by using a casting operator in C#. En el ejemplo siguiente, tanto el intento de convertir un Char valor en una cadena y el intento de convertir un número entero y cadena throw un InvalidCastException excepción.In the following example, both the attempt to cast a Char value to a string and the attempt to cast an integer to a string throw an InvalidCastException exception.

using System;

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

Nota

Uso de Visual Basic CStr para convertir un valor de un tipo primitivo en una cadena, se realiza correctamente.Using the Visual Basic CStr operator to convert a value of a primitive type to a string succeeds. La operación no se produce un InvalidCastException excepción.The operation does not throw an InvalidCastException exception.

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.To successfully covert an instance of any type to its string representation, call its ToString method, as the following example does. El ToString método siempre está presente, desde el ToString método se define mediante el Object clase y, por tanto, es heredado o se reemplaza por todos los tipos administrados.The ToString method is always present, since the ToString method is defined by the Object class and therefore is either inherited or overridden by all managed types.

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

Migración de Visual Basic 6.0Visual Basic 6.0 migration

Va a actualizar una aplicación de Visual Basic 6.0 con una llamada a un evento personalizado en un control de usuario a Visual Basic. NET y un InvalidCastException se produce una excepción con el mensaje, "la conversión especificada no es válido."You're upgrading a Visual Basic 6.0 application with a call to a custom event in a user control to Visual Basic .NET, and an InvalidCastException exception is thrown with the message, "Specified cast is not valid." Para eliminar esta excepción, cambie la línea de código en el formulario (como Form1)To eliminate this exception, change the line of code in your form (such as Form1)

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

y reemplácela con la siguiente línea de código:and replace it with the following line of code:

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

Constructores

InvalidCastException() InvalidCastException() InvalidCastException() InvalidCastException()

Inicializa una nueva instancia de la clase InvalidCastException.Initializes a new instance of the InvalidCastException class.

InvalidCastException(SerializationInfo, StreamingContext) InvalidCastException(SerializationInfo, StreamingContext) InvalidCastException(SerializationInfo, StreamingContext) InvalidCastException(SerializationInfo, StreamingContext)

Inicializa una nueva instancia de la clase InvalidCastException con datos serializados.Initializes a new instance of the InvalidCastException class with serialized data.

InvalidCastException(String) InvalidCastException(String) InvalidCastException(String) InvalidCastException(String)

Inicializa una nueva instancia de la clase InvalidCastException con el mensaje de error especificado.Initializes a new instance of the InvalidCastException class with a specified error message.

InvalidCastException(String, Exception) InvalidCastException(String, Exception) InvalidCastException(String, Exception) InvalidCastException(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.Initializes a new instance of the InvalidCastException class with a specified error message and a reference to the inner exception that is the cause of this exception.

InvalidCastException(String, Int32) InvalidCastException(String, Int32) InvalidCastException(String, Int32) InvalidCastException(String, Int32)

Inicializa una nueva instancia de la clase InvalidCastException con un mensaje y un código de error especificados.Initializes a new instance of the InvalidCastException class with a specified message and error code.

Propiedades

Data Data Data Data

Obtiene una colección de pares clave-valor que proporcionan más información definida por el usuario sobre la excepción.Gets a collection of key/value pairs that provide additional user-defined information about the exception.

(Inherited from Exception)
HelpLink HelpLink HelpLink HelpLink

Obtiene o establece un vínculo al archivo de ayuda asociado a esta excepción.Gets or sets a link to the help file associated with this exception.

(Inherited from Exception)
HResult HResult HResult HResult

Obtiene o establece HRESULT, un valor numérico codificado que se asigna a una excepción específica.Gets or sets HRESULT, a coded numerical value that is assigned to a specific exception.

(Inherited from Exception)
InnerException InnerException InnerException InnerException

Obtiene la instancia Exception que produjo la excepción actual.Gets the Exception instance that caused the current exception.

(Inherited from Exception)
Message Message Message Message

Obtiene un mensaje que describe la excepción actual.Gets a message that describes the current exception.

(Inherited from Exception)
Source Source Source Source

Devuelve o establece el nombre de la aplicación o del objeto que generó el error.Gets or sets the name of the application or the object that causes the error.

(Inherited from Exception)
StackTrace StackTrace StackTrace StackTrace

Obtiene una representación de cadena de los marcos inmediatos en la pila de llamadas.Gets a string representation of the immediate frames on the call stack.

(Inherited from Exception)
TargetSite TargetSite TargetSite TargetSite

Obtiene el método que produjo la excepción actual.Gets the method that throws the current exception.

(Inherited from Exception)

Métodos

Equals(Object) Equals(Object) Equals(Object) Equals(Object)

Determina si el objeto especificado es igual al objeto actual.Determines whether the specified object is equal to the current object.

(Inherited from Object)
GetBaseException() GetBaseException() GetBaseException() GetBaseException()

Cuando se reemplaza en una clase derivada, devuelve la clase Exception que representa la causa principal de una o más excepciones posteriores.When overridden in a derived class, returns the Exception that is the root cause of one or more subsequent exceptions.

(Inherited from Exception)
GetHashCode() GetHashCode() GetHashCode() GetHashCode()

Sirve como la función hash predeterminada.Serves as the default hash function.

(Inherited from Object)
GetObjectData(SerializationInfo, StreamingContext) GetObjectData(SerializationInfo, StreamingContext) GetObjectData(SerializationInfo, StreamingContext) GetObjectData(SerializationInfo, StreamingContext)

Cuando se reemplaza en una clase derivada, establece SerializationInfo con información sobre la excepción.When overridden in a derived class, sets the SerializationInfo with information about the exception.

(Inherited from Exception)
GetType() GetType() GetType() GetType()

Obtiene el tipo de tiempo de ejecución de la instancia actual.Gets the runtime type of the current instance.

(Inherited from Exception)
MemberwiseClone() MemberwiseClone() MemberwiseClone() MemberwiseClone()

Crea una copia superficial del Object actual.Creates a shallow copy of the current Object.

(Inherited from Object)
ToString() ToString() ToString() ToString()

Crea y devuelve una representación de cadena de la excepción actual.Creates and returns a string representation of the current exception.

(Inherited from Exception)

Eventos

SerializeObjectState SerializeObjectState SerializeObjectState SerializeObjectState

Ocurre cuando una excepción se serializa para crear un objeto de estado de excepción que contenga datos serializados sobre la excepción.Occurs when an exception is serialized to create an exception state object that contains serialized data about the exception.

(Inherited from Exception)

Se aplica a

Consulte también: