InvalidCastException Třída

Definice

Výjimka, která je vyvoláná kvůli neplatnému přetypování nebo explicitnímu převodu.

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 odvozených typů na jejich základní typy a zpět na odvozený typ a také z typů, které představují rozhraní k objektům rozhraní a zpět. Zahrnuje také různé mechanismy, které podporují vlastní převody. Další informace najdete v tématu Převod typů v .NET Framework.

Výjimka InvalidCastException se vyvolá v případě, že 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á se vyvolá, když je podporován převod jednoho typu na jiný, ale hodnota zdrojového typu je mimo rozsah cílového typu. Výjimka InvalidCastException je způsobená chybou vývojáře a neměla by být zpracována try/catch v bloku. Místo toho by se měla odstranit příčina výjimky.

Informace o převodech podporovaných systémem najdete ve Convert třídě. Chyby, ke kterým dochází, když cílový typ může ukládat hodnoty zdrojového typu, ale není dostatečně velký k uložení konkrétní zdrojové hodnoty, podívejte se na OverflowException výjimku.

Poznámka

V mnoha případech kompilátor jazyka zjistí, že mezi zdrojovým typem a cílovým typem neexistuje žádný převod a problémy s chybou 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 bylo možné provést explicitní převod odkazu, musí být nullzdrojová hodnota nebo typ objektu odkazovaný zdrojovým argumentem musí být převoditelný na cílový typ implicitním převodem odkazu.

Následující pokyny pro zprostředkující jazyk (IL) vyvolá InvalidCastException výjimku:

  • castclass

  • refanyval

  • unbox

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

Seznam počátečních hodnot vlastností pro instanci InvalidCastExceptionnaleznete v InvalidCastException konstruktorech.

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 hodnotu nebo DateTime hodnotu na Int32 vyvolání InvalidCastException výjimky. Následující příklad volá jak metody Boolean.IConvertible.ToChar , tak i Convert.ToChar(Boolean) metody pro převod Boolean hodnoty na Charhodnotu . V obou případech volání metody vyvolá 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.
open System

let flag = true
try
    let conv: IConvertible = flag
    let ch = conv.ToChar null
    printfn "Conversion succeeded."
with :? InvalidCastException ->
    printfn "Cannot convert a Boolean to a Char."

try
    let ch = Convert.ToChar flag
    printfn "Conversion succeeded."
with :? InvalidCastException ->
    printfn "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í podporovaný, neexistuje žádné alternativní řešení.

Metoda Convert.ChangeType

Volali jste metodu Convert.ChangeType 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í podporovaný, neexistuje žádné alternativní řešení. V některých případech je možné alternativní řešení ručně přiřadit hodnoty vlastností ze zdrojového typu k podobným vlastnostem cílového typu.

Zužování převodů a implementací IConvertible

Zúžení operátorů definuje explicitní převody podporované typem. K provedení převodu se vyžaduje operátor přetypování v jazyce C# nebo metoda převodu CType v Visual Basic (pokud Option Strict je zapnutá).

Pokud ale zdrojový typ ani cílový typ nedefinuje explicitní nebo zúžení převodu mezi těmito dvěma typy a IConvertible implementace jednoho nebo obou typů nepodporuje převod ze zdrojového typu na cílový typ, InvalidCastException vyvolá se výjimka.

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

Downcasting

Právě 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 PersonWithID na objekt nezdaří.

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.
open System

type Person() =
    member val Name = String.Empty with get, set

type PersonWithId() =
    inherit Person()
    member val Id = String.Empty with get, set


let p = Person()
p.Name <- "John"
try
    let pid = p :?> PersonWithId
    printfn "Conversion succeeded."
with :? InvalidCastException ->
    printfn "Conversion failed."

let pid1 = PersonWithId()
pid1.Name <- "John"
pid1.Id <- "246"
let p1: Person = pid1
try
    let pid1a = p1 :?> PersonWithId
    printfn "Conversion succeeded."
with :? InvalidCastException ->
    printfn "Conversion failed."

// The example displays the following output:
//       Conversion failed.
//       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, downcast proběhne úspěšně pouze v případě, že Person objekt byl vytvořen upcast z PersonWithId objektu do objektu Person nebo pokud Person je nullobjekt .

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ý typ nebo základní třída typu, ze kterého byl objekt rozhraní původně odvozen. Následující příklad vyvolá InvalidCastException výjimku, když se pokusí převést IFormatProvider objekt na DateTimeFormatInfo objekt. Převod selže, protože i když DateTimeFormatInfo třída implementuje IFormatProvider rozhraní, objekt nesouvisí s CultureInfo třídou, DateTimeFormatInfo 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()
open System
open System.Globalization

let culture = CultureInfo.InvariantCulture
let provider: IFormatProvider = culture

let dt = provider :?> DateTimeFormatInfo

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

Jak zpráva o výjimce znamená, 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ě .CultureInfo Převod by také byl úspěšný, pokud 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 se pokus o přetypování Char hodnoty do řetězce i pokus o přetypování celého čísla na řetězec vyvolá InvalidCastException výjimku.

using System;

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

Poznámka

Pomocí operátoru Visual Basic CStr převedete hodnotu primitivního typu na řetězec úspěšně. Operace nevyvolá InvalidCastException výjimku.

Pokud chcete úspěšně převést instanci libovolného typu na její řetězcovou reprezentaci, zavolejte metodu ToString , jak to dělá následující příklad. Metoda ToString je vždy přítomna, protože ToString metoda je definována Object třídou, a proto je 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
let value: obj = 12
let s = value.ToString()
printfn $"{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 InvalidCastException zobrazí se výjimka se zprávou , že zadané přetypování není platné. Pokud chcete tuto výjimku odstranit, 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 třídy se zadanou chybovou InvalidCastException 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živatelem 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, kódovanou číselnou hodnotu přiřazenou konkrétní výjimce.

(Zděděno od Exception)
InnerException

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

(Zděděno od Exception)
Message

Získá zprávu, která popisuje aktuální výjimku.

(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

Získá řetězcové znázornění okamžitých rámců 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í Exception hodnotu, která je hlavní příčinou jedné 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í s SerializationInfo 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ří použádnou kopii aktuálního souboru Object.

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

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

(Zděděno od Exception)

událost

SerializeObjectState
Zastaralé.

Nastane, když je výjimka serializována k vytvoření objektu stavu výjimky, který obsahuje serializovaná data o výjimce.

(Zděděno od Exception)

Platí pro

Viz také