InvalidCastException Třída

Definice

Výjimka, která je vyvolána pro neplatné přetypování nebo explicitní převod.

public ref class InvalidCastException : Exception
public ref class InvalidCastException : SystemException
public class InvalidCastException : Exception
public class InvalidCastException : SystemException
[System.Serializable]
public class InvalidCastException : SystemException
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public class InvalidCastException : SystemException
type InvalidCastException = class
    inherit Exception
type InvalidCastException = class
    inherit SystemException
[<System.Serializable>]
type InvalidCastException = class
    inherit SystemException
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type InvalidCastException = class
    inherit SystemException
Public Class InvalidCastException
Inherits Exception
Public Class InvalidCastException
Inherits SystemException
Dědičnost
InvalidCastException
Dědičnost
InvalidCastException
Atributy

Poznámky

.NET Framework podporuje automatický převod z odvozených typů na jejich základní typy a zpět na odvozený typ a také z typů, které představují rozhraní pro objekty rozhraní a zpět. Zahrnuje také řadu mechanismů, které podporují vlastní převody. Další informace naleznete v tématu převod typu v .NET Framework.

InvalidCastExceptionVýjimka je vyvolána, pokud převod instance jednoho typu na jiný typ není podporován. Například pokus o převod Char hodnoty na DateTime hodnotu vyvolá InvalidCastException výjimku. Liší se od OverflowException výjimky, která je vyvolána, když je podporována konverze jednoho typu na jiný, ale hodnota zdrojového typu je mimo rozsah cílového typu. InvalidCastExceptionVýjimka je způsobena chybou vývojáře a neměla by být zpracována v try/catch bloku. Místo toho by měla být příčina výjimky odstraněna.

Informace o převodech podporovaných systémem naleznete v tématu Convert Třída. V případě chyb, ke kterým dochází, když cílový typ může ukládat hodnoty zdrojového typu, ale není dostatečně velký pro uložení konkrétní zdrojové hodnoty, přečtěte si OverflowException výjimku.

Poznámka

V mnoha případech kompilátor jazyka detekuje, že mezi typem zdroje a cílovým typem neexistuje žádný převod a vydá chybu kompilátoru.

Některé podmínky, za kterých pokus o převod vyvolá InvalidCastException výjimku, jsou popsány v následujících částech:

Aby explicitní převod odkazu byl úspěšný, musí být zdrojová hodnota null nebo typ objektu, na který odkazuje zdrojový argument, musí být převoditelné na cílový typ pomocí implicitního referenčního převodu.

Následující pokyny pro mezilehlé jazyky (IL) vyvolávají InvalidCastException výjimku:

  • castclass

  • refanyval

  • unbox

InvalidCastException používá COR_E_INVALIDCAST HRESULT, která má hodnotu 0x80004002.

Seznam počátečních hodnot vlastností instance třídy InvalidCastException naleznete v tématu InvalidCastException konstruktory.

Primitivní typy a IConvertible

Přímo nebo nepřímo voláte implementaci primitivního typu IConvertible , který nepodporuje konkrétní převod. Například pokus o převod Boolean hodnoty na Char nebo na DateTime hodnotu Int32 vyvolá InvalidCastException výjimku. Následující příklad volá Boolean.IConvertible.ToChar Convert.ToChar(Boolean) metody a pro převod Boolean hodnoty na Char . V obou případech vyvolá volání metody InvalidCastException výjimku.

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.

Vzhledem k tomu, že převod není podporován, neexistuje žádné alternativní řešení.

Metoda Convert. ChangeType

Volali jste Convert.ChangeType metodu pro převod objektu z jednoho typu na jiný, ale jeden nebo oba typy neimplementují IConvertible rozhraní.

Ve většině případů, protože převod není podporován, neexistuje žádné alternativní řešení. V některých případech je možné alternativní řešení k ručnímu přiřazení hodnot vlastností ze zdrojového typu k podobným vlastnostem cílového typu.

Zužující převody a implementace IConvertible

Zužující operátory definují explicitní převody podporované typem. k provedení převodu je vyžadován operátor přetypování v jazyce C# nebo CType metoda převodu v Visual Basic (pokud Option Strict je zapnutý).

Nicméně, pokud ani zdrojový typ ani cílový typ nedefinuje explicitní nebo zužující převod mezi dvěma typy a IConvertible implementace jednoho nebo obou typů nepodporuje převod ze zdrojového typu na cílový typ, InvalidCastException je vyvolána výjimka.

Ve většině případů, protože převod není podporován, neexistuje žádné alternativní řešení.

Potřeby

Jste potřeby, to znamená, že se pokoušíte převést instanci základního typu na jeden z jeho odvozených typů. V následujícím příkladu se pokus o převod Person objektu na PersonWithID objekt nezdařil.

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.

Jak ukazuje příklad, přetypování downcast je úspěšné pouze v případě, že Person byl objekt vytvořen přetypováním z PersonWithId objektu na Person objekt, nebo pokud Person je objekt null .

Převod z objektu rozhraní

Pokoušíte se převést objekt rozhraní na typ, který implementuje toto rozhraní, ale cílový typ není stejného typu nebo základní třída typu, ze kterého byl objekt rozhraní původně odvozen. Následující příklad vyvolá InvalidCastException výjimku při pokusu o převod IFormatProvider objektu na DateTimeFormatInfo objekt. Převod se nezdařil, protože i když DateTimeFormatInfo Třída implementuje IFormatProvider rozhraní, DateTimeFormatInfo objekt nesouvisí se CultureInfo třídou, ze které byl objekt rozhraní odvozen.

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()

Jelikož zpráva o výjimce označuje, převod by byl úspěšný pouze v případě, že je objekt rozhraní převeden zpět na instanci původního typu, v tomto případě a CultureInfo . Převod by byl úspěšný i v případě, že je objekt rozhraní převeden na instanci základního typu původního typu.

Převody řetězců

Pokoušíte se převést hodnotu nebo objekt na jeho řetězcovou reprezentaci pomocí operátoru přetypování v jazyce C#. V následujícím příkladu pokus o přetypování Char hodnoty na řetězec a pokus o přetypování celého čísla na řetězec vyvolají InvalidCastException výjimku.

using System;

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

Poznámka

použití CStr operátoru Visual Basic pro převod hodnoty primitivního typu na řetězec je úspěšný. Operace nevyvolá InvalidCastException výjimku.

Chcete-li úspěšně převést instanci libovolného typu na jeho řetězcovou reprezentaci, zavolejte ToString metodu, jak je uvedeno v následujícím příkladu. ToStringMetoda je vždy přítomna, protože ToString Metoda je definována Object třídou, a proto je buď zděděna, nebo přepsána všemi spravovanými typy.

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

migrace Visual Basic 6,0

upgradujete aplikaci Visual Basic 6,0 s voláním vlastní události v uživatelském ovládacím prvku na Visual Basic .net a v rámci InvalidCastException zprávy je vyvolána výjimka "zadané přetypování není platné." Chcete-li odstranit tuto výjimku, změňte řádek kódu ve formuláři (například). Form1

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

a nahraďte ho následujícím řádkem kódu:

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

Konstruktory

InvalidCastException()

Inicializuje novou instanci InvalidCastException třídy.

InvalidCastException(SerializationInfo, StreamingContext)

Inicializuje novou instanci třídy InvalidCastException se serializovanými daty.

InvalidCastException(String)

Inicializuje novou instanci InvalidCastException třídy se zadanou chybovou zprávou.

InvalidCastException(String, Exception)

Inicializuje novou instanci InvalidCastException třídy se zadanou chybovou zprávou a odkazem na vnitřní výjimku, která je příčinou této výjimky.

InvalidCastException(String, Int32)

Inicializuje novou instanci InvalidCastException třídy se zadanou zprávou a kódem chyby.

Vlastnosti

Data

Získá kolekci párů klíč/hodnota, které poskytují další uživatelsky definované informace o výjimce.

(Zděděno od Exception)
HelpLink

Získá nebo nastaví odkaz na soubor nápovědy přidružený k této výjimce.

(Zděděno od Exception)
HResult

Získá nebo nastaví HRESULT, programovou číselnou hodnotu, která je přiřazena ke konkrétní výjimce.

(Zděděno od Exception)
InnerException

Získá Exception instanci, která způsobila aktuální výjimku.

(Zděděno od Exception)
Message

Získá zprávu s popisem aktuální výjimky.

(Zděděno od Exception)
Source

Získá nebo nastaví název aplikace nebo objektu, který způsobuje chybu.

(Zděděno od Exception)
StackTrace

Načte řetězcovou reprezentaci okamžitých snímků v zásobníku volání.

(Zděděno od Exception)
TargetSite

Získá metodu, která vyvolá aktuální výjimku.

(Zděděno od Exception)

Metody

Equals(Object)

Určí, zda se zadaný objekt rovná aktuálnímu objektu.

(Zděděno od Object)
GetBaseException()

Při přepsání v odvozené třídě vrátí objekt , který je hlavní příčinou jedné Exception nebo více následných výjimek.

(Zděděno od Exception)
GetHashCode()

Slouží jako výchozí funkce hash.

(Zděděno od Object)
GetObjectData(SerializationInfo, StreamingContext)

Při přepsání v odvozené třídě nastaví objekt SerializationInfo s informacemi o výjimce.

(Zděděno od Exception)
GetType()

Získá typ modulu runtime aktuální instance.

(Zděděno od Exception)
MemberwiseClone()

Vytvoří kopii aktuálního seznamu Object .

(Zděděno od Object)
ToString()

Vytvoří a vrátí řetězcovou reprezentaci aktuální výjimky.

(Zděděno od Exception)

Události

SerializeObjectState
Zastaralé.

Nastane, pokud je serializovaná výjimka pro vytvoření objektu stavu výjimky, který obsahuje Serializovaná data o výjimce.

(Zděděno od Exception)

Platí pro

Viz také