InvalidCastException Klasse
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
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
- Vererbung
- 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:
- Grundtypen und IConvertible
- Die Convert.ChangeType-Methode
- Einschränken von Konvertierungen und IConvertible-Implementierungen
- Downcasting
- Konvertierung aus einem Schnittstellenobjekt
- Zeichenfolgenkonvertierung
- Visual Basic 6.0-Migration
Damit eine explizite Verweiskonvertierung erfolgreich ist, muss null
der 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) |