InvalidCastException Klasse

Definition

Die Ausnahme, die bei einer ungültigen Umwandlung oder expliziten Konvertierung ausgelöst wird.

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
Vererbung
InvalidCastException
Vererbung
InvalidCastException
Attribute

Hinweise

.NET Framework unterstützt die automatische Konvertierung von abgeleiteten Typen in ihre Basistypen und zurück zum abgeleiteten Typ sowie von Typen, die Schnittstellen zu Schnittstellenobjekten und zurück darstellen. Es enthält auch eine Vielzahl von Mechanismen, die benutzerdefinierte Konvertierungen unterstützen. Weitere Informationen finden Sie unter "Typkonvertierung" in .NET Framework.

Eine InvalidCastException Ausnahme wird ausgelöst, wenn die Konvertierung einer Instanz eines Typs in einen anderen Typ nicht unterstützt wird. Beispielsweise wird beim Versuch, einen Char Wert in einen DateTime Wert zu konvertieren, eine InvalidCastException Ausnahme ausgelöst. Es unterscheidet sich von einer OverflowException Ausnahme, die ausgelöst wird, wenn eine Konvertierung eines Typs in einen anderen unterstützt wird, aber der Wert des Quelltyps liegt außerhalb des Bereichs des Zieltyps. Eine InvalidCastException Ausnahme wird durch Entwicklerfehler verursacht und sollte nicht in einem try/catch Block behandelt werden. Stattdessen sollte die Ursache der Ausnahme beseitigt werden.

Informationen zu konvertierungen, die vom System unterstützt werden, finden Sie in der Convert Klasse. Fehler, die auftreten, wenn der Zieltyp Quelltypwerte speichern kann, aber nicht groß genug ist, um einen bestimmten Quellwert zu speichern, finden Sie in der OverflowException Ausnahme.

Hinweis

In vielen Fällen erkennt ihr Sprachcompiler, dass zwischen dem Quelltyp und dem Zieltyp keine Konvertierung vorhanden ist und ein Compilerfehler auftritt.

Einige der Bedingungen, unter denen eine versuchte Konvertierung eine InvalidCastException Ausnahme auslöst, werden in den folgenden Abschnitten erläutert:

Damit eine explizite Verweiskonvertierung erfolgreich ist, muss nullder Quellwert sein, oder der objekttyp, auf den das Quellargument verweist, muss durch eine implizite Verweiskonvertierung in den Zieltyp konvertiert werden.

Die folgenden Il-Anweisungen (Zwischensprache) lösen eine InvalidCastException Ausnahme aus:

  • castclass

  • refanyval

  • unbox

InvalidCastException verwendet die HRESULT-COR_E_INVALIDCAST, die den Wert 0x80004002 hat.

Eine Liste der anfänglichen Eigenschaftswerte für eine Instanz von InvalidCastException, finden Sie unter den InvalidCastException Konstruktoren.

Grundtypen und IConvertible

Sie rufen die Implementierung eines Grundtyps IConvertible direkt oder indirekt auf, die keine bestimmte Konvertierung unterstützt. Wenn Sie beispielsweise versuchen, einen Boolean Wert in einen Char oder einen DateTime Wert zu Int32 konvertieren, wird eine InvalidCastException Ausnahme ausgelöst. Im folgenden Beispiel werden sowohl die Methoden als auch die Boolean.IConvertible.ToChar Convert.ToChar(Boolean) Methoden aufgerufen, um einen Boolean Wert in einen CharWert zu konvertieren. In beiden Fällen löst der Methodenaufruf eine InvalidCastException Ausnahme aus.

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.

Da die Konvertierung nicht unterstützt wird, gibt es keine Problemumgehung.

Die Convert.ChangeType-Methode

Sie haben die Convert.ChangeType Methode aufgerufen, um ein Objekt von einem Typ in einen anderen zu konvertieren, aber eine oder beide Typen implementieren die IConvertible Schnittstelle nicht.

In den meisten Fällen, da die Konvertierung nicht unterstützt wird, gibt es keine Problemumgehung. In einigen Fällen ist eine mögliche Problemumgehung das manuelle Zuweisen von Eigenschaftswerten vom Quelltyp zu ähnlichen Eigenschaften eines Zieltyps.

Einschränken von Konvertierungen und IConvertible-Implementierungen

Schmale Operatoren definieren die expliziten Konvertierungen, die von einem Typ unterstützt werden. Ein Umwandlungsoperator in C# oder die CType Konvertierungsmethode in Visual Basic (sofern Option Strict aktiviert) ist erforderlich, um die Konvertierung auszuführen.

Wenn jedoch weder der Quelltyp noch der Zieltyp eine explizite oder schmale Konvertierung zwischen den beiden Typen definiert und die IConvertible Implementierung eines oder beider Typen keine Konvertierung vom Quelltyp in den Zieltyp unterstützt, wird eine InvalidCastException Ausnahme ausgelöst.

In den meisten Fällen, da die Konvertierung nicht unterstützt wird, gibt es keine Problemumgehung.

Downcasting

Sie sind downcasting, das heißt, versuchen, eine Instanz eines Basistyps in einen der abgeleiteten Typen zu konvertieren. Im folgenden Beispiel schlägt der Versuch, ein Person Objekt in ein PersonWithID Objekt zu konvertieren, fehl.

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.

Wie das Beispiel zeigt, ist die Downcast nur erfolgreich, wenn das Person Objekt von einem Objekt zu einem PersonWithId Person Objekt erstellt wurde oder wenn es sich um das Person Objekt handelt null.

Konvertierung aus einem Schnittstellenobjekt

Sie versuchen, ein Schnittstellenobjekt in einen Typ zu konvertieren, der diese Schnittstelle implementiert, aber der Zieltyp ist nicht derselbe Typ oder eine Basisklasse des Typs, von dem das Schnittstellenobjekt ursprünglich abgeleitet wurde. Im folgenden Beispiel wird eine InvalidCastException Ausnahme ausgelöst, wenn versucht wird, ein IFormatProvider Objekt in ein DateTimeFormatInfo Objekt zu konvertieren. Die Konvertierung schlägt fehl, da die DateTimeFormatInfo Klasse zwar die IFormatProvider Schnittstelle implementiert, das DateTimeFormatInfo Objekt jedoch nicht mit der CultureInfo Klasse verknüpft ist, aus der das Schnittstellenobjekt abgeleitet wurde.

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

Wie die Ausnahmemeldung angibt, würde die Konvertierung nur erfolgreich sein, wenn das Schnittstellenobjekt zurück in eine Instanz des ursprünglichen Typs konvertiert wird, in diesem Fall a CultureInfo. Die Konvertierung würde auch erfolgreich sein, wenn das Schnittstellenobjekt in eine Instanz eines Basistyps des ursprünglichen Typs konvertiert wird.

Zeichenfolgenkonvertierung

Sie versuchen, einen Wert oder ein Objekt in seine Zeichenfolgendarstellung zu konvertieren, indem Sie einen Umwandlungsoperator in C# verwenden. Im folgenden Beispiel wird sowohl der Versuch, einen Char Wert in eine Zeichenfolge zu umwandeln, als auch der Versuch, eine ganze Zahl in eine Zeichenfolge zu umwandeln, eine InvalidCastException Ausnahme auslösen.

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

Hinweis

Wenn Sie den Visual Basic-Operator CStr verwenden, um einen Wert eines Grundtyps in eine Zeichenfolge zu konvertieren, ist erfolgreich. Der Vorgang löst InvalidCastException keine Ausnahme aus.

Wenn Sie eine Instanz eines beliebigen Typs erfolgreich in die Zeichenfolgendarstellung konvertieren möchten, rufen Sie die ToString Methode auf, wie im folgenden Beispiel. Die ToString Methode ist immer vorhanden, da die Methode durch die ToString Object Klasse definiert wird und daher entweder von allen verwalteten Typen geerbt oder überschrieben wird.

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

Visual Basic 6.0-Migration

Sie aktualisieren eine Visual Basic 6.0-Anwendung mit einem Aufruf eines benutzerdefinierten Ereignisses in einem Benutzersteuerelement auf Visual Basic .NET, und eine InvalidCastException Ausnahme wird mit der Meldung "Angegebene Umwandlung ist ungültig" ausgelöst. Um diese Ausnahme zu beseitigen, ändern Sie die Codezeile in Ihrem Formular (z Form1. B. )

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

und ersetzen Sie ihn durch die folgende Codezeile:

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

Konstruktoren

InvalidCastException()

Initialisiert eine neue Instanz der InvalidCastException-Klasse.

InvalidCastException(SerializationInfo, StreamingContext)

Initialisiert eine neue Instanz der InvalidCastException-Klasse mit serialisierten Daten.

InvalidCastException(String)

Initialisiert eine neue Instanz der InvalidCastException-Klasse mit einer angegebenen Fehlermeldung.

InvalidCastException(String, Exception)

Initialisiert eine neue Instanz der InvalidCastException-Klasse mit einer angegebenen Fehlermeldung und einem Verweis auf die innere Ausnahme, die diese Ausnahme ausgelöst hat.

InvalidCastException(String, Int32)

Initialisiert eine neue Instanz der InvalidCastException-Klasse mit einer angegebenen Meldung und einem angegebenen Fehlercode.

Eigenschaften

Data

Ruft eine Auflistung von Schlüssel-Wert-Paaren ab, die zusätzliche benutzerdefinierte Informationen zur Ausnahme bereitstellen.

(Geerbt von Exception)
HelpLink

Ruft einen Link zur Hilfedatei ab, die dieser Ausnahme zugeordnet ist, oder legt einen Link fest.

(Geerbt von Exception)
HResult

Ruft HRESULT ab oder legt HRESULT fest. Dies ist ein codierter Wert, der einer bestimmten Ausnahme zugeordnet ist.

(Geerbt von Exception)
InnerException

Ruft die Exception-Instanz ab, die die aktuelle Ausnahme verursacht hat.

(Geerbt von Exception)
Message

Ruft eine Meldung ab, mit der die aktuelle Ausnahme beschrieben wird.

(Geerbt von Exception)
Source

Gibt den Namen der Anwendung oder des Objekts zurück, die bzw. das den Fehler verursacht hat, oder legt diesen fest.

(Geerbt von Exception)
StackTrace

Ruft eine Zeichenfolgendarstellung der unmittelbaren Frames in der Aufrufliste ab.

(Geerbt von Exception)
TargetSite

Ruft die Methode ab, die die aktuelle Ausnahme auslöst.

(Geerbt von Exception)

Methoden

Equals(Object)

Bestimmt, ob das angegebene Objekt gleich dem aktuellen Objekt ist.

(Geerbt von Object)
GetBaseException()

Gibt beim Überschreiben in einer abgeleiteten Klasse eine Exception zurück, die die Grundursache für eine oder mehrere nachfolgende Ausnahmen ist.

(Geerbt von Exception)
GetHashCode()

Fungiert als Standardhashfunktion.

(Geerbt von Object)
GetObjectData(SerializationInfo, StreamingContext)

Legt beim Überschreiben in einer abgeleiteten Klasse die SerializationInfo mit Informationen über die Ausnahme fest.

(Geerbt von Exception)
GetType()

Ruft den Laufzeittyp der aktuellen Instanz ab.

(Geerbt von Exception)
MemberwiseClone()

Erstellt eine flache Kopie des aktuellen Object.

(Geerbt von Object)
ToString()

Erstellt eine Zeichenfolgendarstellung der aktuellen Ausnahme und gibt diese zurück.

(Geerbt von Exception)

Ereignisse

SerializeObjectState
Veraltet.

Tritt auf, wenn eine Ausnahme serialisiert wird, um ein Ausnahmezustandsobjekt mit serialisierten Daten über die Ausnahme zu erstellen.

(Geerbt von Exception)

Gilt für

Siehe auch