safe_cast (C++/CLI und C++/CX)
Der safe_cast-Vorgang gibt im Erfolgsfall den angegebenen Ausdruck als den angegebenen Typ zurück, andernfalls wird eine InvalidCastException
ausgelöst.
Alle Laufzeiten
(Es gibt keine Hinweise für diese Sprachfunktion, die für alle Laufzeiten gültig sind.)
Syntax
[default]:: safe_cast< type-id >( expression )
Windows-Runtime
Mit safe_cast können Sie den Typ eines angegebenen Ausdrucks ändern. In Situationen, in denen Sie mit Sicherheit erwarten, dass eine Variable oder ein Parameter zu einem bestimmten Typ konvertiert werden kann, können Sie safe_cast ohne einen try-catch-Block verwenden, um während der Entwicklung Programmierfehler zu ermitteln. Weitere Informationen finden Sie unter Umwandlung (C++/CX).
Syntax
[default]:: safe_cast< type-id >( expression )
Parameter
type-id
Der Typ, zu dem expression konvertiert werden soll. Ein Handle zu einem Verweis- oder Werttyp, ein Werttyp oder ein Nachverfolgungsverweis auf einen Verweis- oder Werttyp.
expression
Ein Ausdruck, der als ein Handle zu einem Verweis oder Werttyp ausgewertet wird, ein Werttyp oder ein Nachverfolgungsverweis auf einen Verweis- oder Werttyp.
Hinweise
safe_cast wird ausgelöstInvalidCastException
, wenn kein Ausdruck in den durch typ-ID angegebenen Typ konvertiert werden kann. Geben Sie zum Abfangen InvalidCastException
die Compileroption /EH (Ausnahmebehandlungsmodell) an, und verwenden Sie eine try/catch-Anweisung.
Anforderungen
Compileroption: /ZW
Beispiele
Der folgende Code veranschaulicht die Verwendung von safe_cast mit der Windows-Runtime.
// safe_cast_ZW.cpp
// compile with: /ZW /EHsc
using namespace default;
using namespace Platform;
interface class I1 {};
interface class I2 {};
interface class I3 {};
ref class X : public I1, public I2 {};
int main(Array<String^>^ args) {
I1^ i1 = ref new X;
I2^ i2 = safe_cast<I2^>(i1); // OK, I1 and I2 have common type: X
// I2^ i3 = static_cast<I2^>(i1); C2440 use safe_cast instead
try {
I3^ i4 = safe_cast<I3^>(i1); // Fails because i1 is not derived from I3.
}
catch(InvalidCastException^ ic) {
wprintf(L"Caught expected exception: %s\n", ic->Message);
}
}
Caught expected exception: InvalidCastException
Übersicht: Common Language Runtime (CLR)
Mit safe_cast können Sie den Typ eines Ausdrucks ändern und überprüfbaren MSIL-Code generieren.
Syntax
[cli]:: safe_cast< type-id >( expression )
Parameter
type-id
Ein Handle zu einem Verweis- oder Werttyp, ein Werttyp oder ein Nachverfolgungsverweis auf einen Verweis- oder Werttyp.
expression
Ein Ausdruck, der als ein Handle zu einem Verweis oder Werttyp ausgewertet wird, ein Werttyp oder ein Nachverfolgungsverweis auf einen Verweis- oder Werttyp.
Hinweise
Der Ausdruck safe_cast<
type-id>(
expression)
konvertiert den Operanden expression in ein Objekt vom Typ type-id.
Der Compiler akzeptiert static_cast an den meisten Stellen, an denen auch safe_cast akzeptiert wird. Safe_cast ist jedoch garantiert, dass überprüfbare MSIL hergestellt wird, während ein static_cast
nicht nachweisbarer MSIL-Vorgang erzeugt werden kann. Weitere Informationen zu überprüfbarem Code finden Sie unter Reiner und überprüfbarer Code (C++/CLI) und Peverify.exe (PEVerify-Tool).
Wie static_cast
ruft safe_cast benutzerdefinierte Konvertierungen auf.
Weitere Informationen zu Umwandlungen finden Sie unter Umwandlungsoperatoren.
safe_cast wendet keine (abwesendconst
) an const_cast
.
safe_cast befindet sich im cli-Namespace. Weitere Informationen finden Sie unter Namespaces „Platform“, „default“ und „cli“.
Weitere Informationen über safe_cast finden Sie hier:
Anforderungen
Compileroption: /clr
Beispiele
Ein Beispiel dafür, dass der Compiler keine a static_cast
, sondern eine safe_cast akzeptiert, ist für Umwandlungen zwischen nicht verknüpften Schnittstellentypen vorgesehen. Mit safe_cast gibt der Compiler keinen Konvertierungsfehler aus und führt zur Laufzeit eine Überprüfung aus, um zu ermitteln, ob die Umwandlung möglich ist.
// safe_cast.cpp
// compile with: /clr
using namespace System;
interface class I1 {};
interface class I2 {};
interface class I3 {};
ref class X : public I1, public I2 {};
int main() {
I1^ i1 = gcnew X;
I2^ i2 = safe_cast<I2^>(i1); // OK, I1 and I2 have common type: X
// I2^ i3 = static_cast<I2^>(i1); C2440 use safe_cast instead
try {
I3^ i4 = safe_cast<I3^>(i1); // fail at runtime, no common type
}
catch(InvalidCastException^) {
Console::WriteLine("Caught expected exception");
}
}
Caught expected exception