Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Megjegyzés:
Ez a cikk kiegészítő megjegyzéseket tartalmaz az API referenciadokumentációjához.
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))