InvalidCastException Osztály
Definíció
Fontos
Egyes információk olyan, kiadás előtti termékekre vonatkoznak, amelyek a kiadásig még jelentősen módosulhatnak. A Microsoft nem vállal kifejezett vagy törvényi garanciát az itt megjelenő információért.
A kivétel, amely érvénytelen öntés vagy explicit átalakítás esetén van kivetve.
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
- Öröklődés
- Öröklődés
- Attribútumok
Megjegyzések
A .NET támogatja a származtatott típusok automatikus konvertálását az alaptípusokra és vissza a származtatott típusra, valamint az interfész típusok konvertálását interfész objektumokra és vissza. Emellett számos olyan mechanizmust is tartalmaz, amelyek támogatják az egyéni átalakításokat. További információ: Típuskonvertálás a .NET-ben.
Kivétel InvalidCastException akkor fordul elő, ha az egyik típus egy példányának egy másik típusra való konvertálása nem támogatott. Például, egy Char érték DateTime értékké történő konvertálásának megkísérlése egy InvalidCastException kivételt dob. Ez különbözik egy OverflowException kivételtől, amely akkor fordul elő, ha az egyik típus egy másikra való konvertálása támogatott, de a forrástípus értéke kívül esik a céltípus tartományán. A InvalidCastException kivételt fejlesztői hiba okozza, ezért nem szabad blokkban try/catch kezelni. Ehelyett meg kell szüntetni a kivétel okát.
A rendszer által támogatott konverziókkal kapcsolatos információkért tekintse meg az osztályt Convert . Olyan hibák esetén, amelyek akkor fordulnak elő, amikor a céltípus tárolhatja a forrástípus értékeit, de nem elég nagy egy adott forrásérték tárolásához, tekintse meg a kivételt OverflowException .
Megjegyzés:
A nyelvi fordító sok esetben észleli, hogy a forrástípus és a céltípus között nincs átalakítás, és fordítóhibát okoz.
A következő szakaszok ismertetik azokat a feltételeket, amelyek mellett a konvertálási kísérlet kivételt InvalidCastException eredményez.
Ahhoz, hogy egy explicit hivatkozás konvertálása sikeres legyen, a forrásértéknek meg kell lennie null, vagy a forrásargumentum által hivatkozott objektumtípusnak implicit referenciakonvertálással konvertálhatónak kell lennie a céltípusra.
A következő köztes nyelv (IL) utasítások kivételt képeznek InvalidCastException :
castclassrefanyvalunbox
InvalidCastException A HRESULT COR_E_INVALIDCASTfüggvényt használja, amelynek értéke 0x80004002.
A InvalidCastException példány kezdeti tulajdonságainak listájáért tekintse meg a InvalidCastException konstruktorokat.
Primitív típusok és IConvertible
Közvetlenül vagy közvetve olyan primitív típus implementációját IConvertible hívhatja meg, amely nem támogatja az adott átalakítást. Ha például megpróbálja átalakítani egy Boolean értéket Char értékké, vagy egy DateTime értéket Int32 értékké, az InvalidCastException kivételt eredményez. Az alábbi példa meghívja a Boolean.IConvertible.ToChar és Convert.ToChar(Boolean) metódusokat egy Boolean érték Char-vé történő konvertálásához. Mindkét esetben a metódushívás kivételt InvalidCastException eredményez.
using System;
public class IConvertibleEx
{
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 Example2
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.
Mivel az átalakítás nem támogatott, nincs lehetséges megoldás.
A Convert.ChangeType metódus
Az Convert.ChangeType metódust hívta meg az objektum egyik típusból a másikba való konvertálására, de az egyik vagy mindkét típus nem implementálja a IConvertible interfészt.
A legtöbb esetben, mivel az átalakítás nem támogatott, nincs alternatív megoldás. Bizonyos esetekben egy lehetséges megoldás az, hogy a tulajdonságértékeket manuálisan hozzárendeljük a forrástípusból a céltípus hasonló tulajdonságaihoz.
Szűkítő konverziók és IConvertible-implementációk
A szűkítő operátorok határozzák meg a típus által támogatott explicit konverziókat. A konvertálás végrehajtásához c#-beli casting operátorra vagy a CType Visual Basicben használt konverziós metódusra (ha Option Strict be van kapcsolva) van szükség.
Ha azonban sem a forrástípus, sem a céltípus nem határoz meg explicit vagy szűkítő konverziót a két típus között, és az IConvertible egyik vagy mindkét típus megvalósítása nem támogatja a forrástípusról a céltípusra való konvertálást, InvalidCastException kivételt jelent.
A legtöbb esetben, mivel az átalakítás nem támogatott, nincs alternatív megoldás.
Típuscsökkentés
Az alacsonyabb típusba való konvertálásról van szó, azaz egy alaptípus egy példányát próbálja az egyik származtatott típussá konvertálni. Az alábbi példában egy Person objektum PersonWithID objektummá konvertálása meghiúsul.
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 Example1
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.
Ahogy a példa is mutatja, a lecastolás csak akkor sikeres, ha az Person objektumot egy PersonWithId objektumról egy Person objektumra való felfelé történő kasztolása hozta létre, vagy ha az Person objektum null objektum.
Átalakítás interfész objektumból
Egy illesztőobjektumot olyan típussá próbál konvertálni, amely implementálja az adott felületet, de a céltípus nem ugyanaz a típus, vagy annak a típusnak az alaposztálya, amelyből az illesztőobjektum eredetileg származik. Az alábbi példa InvalidCastException kivételt okoz, amikor egy IFormatProvider objektumot próbál egy DateTimeFormatInfo objektummá alakítani. Az átalakítás sikertelen, mert bár az DateTimeFormatInfo osztály implementálja az IFormatProvider interfészt, az DateTimeFormatInfo objektum nem kapcsolódik ahhoz az CultureInfo osztályhoz, amelyből az interfészobjektum származik.
using System;
using System.Globalization;
public class InterfaceEx
{
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 Example3
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()
Ahogy a kivételt jelző üzenet jelzi, az átalakítás csak akkor sikerülne, ha az illesztőobjektumot az eredeti típusú példányra konvertálják, ebben az esetben a CultureInfo. Az átalakítás akkor is sikeres lenne, ha az illesztőobjektumot az eredeti típus alaptípusának egy példányává konvertálná.
Sztringkonvertálások
Egy értéket vagy objektumot próbál sztringre konvertálni egy C#-beli casting operátor használatával. Az alábbi példában az érték sztringre való leadására Char tett kísérlet és az egész szám sztringre való leadására tett kísérlet kivételt InvalidCastException eredményez.
public class StringEx
{
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
Megjegyzés:
A Visual Basic CStr operátorral sikeresen sztringgé alakítható egy primitív típusú érték. A művelet nem dob kivételt InvalidCastException.
Ha bármilyen típusú példányt szeretne sztring-ábrázolásúvá alakítani, hívja meg a metódusát ToString , ahogyan az a következő példában is látható. A ToString metódus mindig jelen van, mivel a ToString metódust az Object osztály határozza meg, ezért az összes felügyelt típus örökli vagy felülírja.
using System;
public class ToStringEx2
{
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 migrálása
A Visual Basic 6.0-alkalmazást Visual Basic .NET-re frissíti, miközben egy felhasználói vezérlőben egy egyéni eseményt hív meg, és ekkor kivétel InvalidCastException keletkezik a következő üzenettel: "A megadott konvertálás érvénytelen". A kivétel megszüntetéséhez módosítsa a kódsort az űrlapon (például Form1)
Call UserControl11_MyCustomEvent(UserControl11, New UserControl1.MyCustomEventEventArgs(5))
és cserélje le a következő kódsorra:
Call UserControl11_MyCustomEvent(UserControl11(0), New UserControl1.MyCustomEventEventArgs(5))
Konstruktorok
| Name | Description |
|---|---|
| InvalidCastException() |
Inicializálja a InvalidCastException osztály új példányát. |
| InvalidCastException(SerializationInfo, StreamingContext) |
Elavult.
Inicializálja az InvalidCastException osztály új példányát szerializált adatokkal. |
| InvalidCastException(String, Exception) |
Inicializálja az InvalidCastException osztály új példányát egy megadott hibaüzenettel és a kivétel okaként szolgáló belső kivételre mutató hivatkozással. |
| InvalidCastException(String, Int32) |
Inicializálja az InvalidCastException osztály új példányát egy megadott üzenettel és hibakóddal. |
| InvalidCastException(String) |
Inicializálja az InvalidCastException osztály új példányát egy megadott hibaüzenettel. |
Tulajdonságok
| Name | Description |
|---|---|
| Data |
Lekéri a kulcs-/érték párok gyűjteményét, amelyek további, felhasználó által definiált információkat biztosítanak a kivételről. (Öröklődés forrása Exception) |
| HelpLink |
Lekéri vagy beállítja a kivételhez társított súgófájlra mutató hivatkozást. (Öröklődés forrása Exception) |
| HResult |
Lekéri vagy beállítja a HRESULT-ot, egy kódolt numerikus értéket, amely egy adott kivételhez van hozzárendelve. (Öröklődés forrása Exception) |
| InnerException |
Lekéri az Exception aktuális kivételt okozó példányt. (Öröklődés forrása Exception) |
| Message |
Az aktuális kivételt leíró üzenet jelenik meg. (Öröklődés forrása Exception) |
| Source |
Lekéri vagy beállítja az alkalmazás vagy a hibát okozó objektum nevét. (Öröklődés forrása Exception) |
| StackTrace |
Lekéri a hívásverem közvetlen kereteinek sztringképét. (Öröklődés forrása Exception) |
| TargetSite |
Lekéri az aktuális kivételt okozó metódust. (Öröklődés forrása Exception) |
Metódusok
| Name | Description |
|---|---|
| Equals(Object) |
Meghatározza, hogy a megadott objektum egyenlő-e az aktuális objektummal. (Öröklődés forrása Object) |
| GetBaseException() |
Ha egy származtatott osztály felül van bírálva, egy Exception vagy több későbbi kivétel kiváltó okát adja vissza. (Öröklődés forrása Exception) |
| GetHashCode() |
Ez az alapértelmezett kivonatoló függvény. (Öröklődés forrása Object) |
| GetObjectData(SerializationInfo, StreamingContext) |
Elavult.
Ha felül van bírálva egy származtatott osztályban, a SerializationInfo kivétel adatait adja meg. (Öröklődés forrása Exception) |
| GetType() |
Lekéri az aktuális példány futtatókörnyezeti típusát. (Öröklődés forrása Exception) |
| MemberwiseClone() |
Az aktuális Objectpéldány sekély másolatát hozza létre. (Öröklődés forrása Object) |
| ToString() |
Létrehozza és visszaadja az aktuális kivétel sztring-ábrázolását. (Öröklődés forrása Exception) |
esemény
| Name | Description |
|---|---|
| SerializeObjectState |
Elavult.
Akkor fordul elő, ha a kivétel szerializálva van egy kivételállapot-objektum létrehozásához, amely szerializált adatokat tartalmaz a kivételről. (Öröklődés forrása Exception) |