safe_cast (Komponentenerweiterungen für C++)
Der safe_cast-Vorgang gibt den angegebenen Ausdruck nach erfolgreicher Durchführung als den angegebenen Typ zurück. Andernfalls wird 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 erwarten, dass eine Variable oder ein Parameter vollständig zu einem bestimmten Typ konvertierbar ist, können Sie safe_cast ohne einen try-catch-Block verwenden, um Programmierfehler während der Entwicklung zu erkennen. Weitere Informationen finden Sie unter Downcasting (C++/CX).
Syntax
[default]::safe_cast<type-id>(expression)
Parameter
type-id
Der Typ, in den expression konvertiert werden soll. Ein Handle für einen Verweis oder einen Werttyp, ein Werttyp oder ein Nachverfolgungsverweis auf einen Verweis oder auf einen Werttyp.expression
Ein Ausdruck, der einen Handle für einen Verweis oder für einen Werttyp, einen Werttyp oder einen Nachverfolgungsverweis auf einen Verweis oder auf einen Werttyp bewertet.
Hinweise
safe_cast löst InvalidCastException aus, wenn expression nicht in den Typ konvertieren kann, der durch type-id angegebenen Steuerzeichen. Um InvalidCastException abzufangen, geben Sie die /EH (Ausnahmebehandlungsmodell)-Compileroption an, und verwenden Sie eine try/catch-Anweisung.
Voraussetzungen
Compileroption: /ZW
Beispiele
Beispiel
Das folgende Codebeispiel zeigt, wie Sie safe_cast mit Windows-Runtime verwenden.
// 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);
}
}
Ausgabe
Common Language Runtime
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 für einen Verweis oder einen Werttyp, ein Werttyp oder ein Nachverfolgungsverweis auf einen Verweis oder auf einen Werttyp.expression
Ein Ausdruck, der einen Handle für einen Verweis oder für einen Werttyp, einen Werttyp oder einen Nachverfolgungsverweis auf einen Verweis oder auf einen Werttyp bewertet.
Hinweise
Der Ausdruck safe_cast<type-id>(expression) konvertiert den Operandenausdruck auf ein Objekt der Typ-TypID.
Der Compiler akzeptiert ein static_cast an den meisten Stellen, an denen er auch safe_cast akzeptiert. safe_cast erzeugt jedoch garantiert überprüfbare MSIL, ein static_cast könnte hingegen nicht überprüfbare MSIL erzeugen. 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_castbenutzerdefinierte Konvertierungen auf.
Weitere Informationen über Umwandlungen finden Sie unter Umwandlungsoperatoren.
safe_cast gilt nicht für const_cast (Umwandeln von const).
safe_cast befindet sich im cli-Namespace. Weitere Informationen finden Sie unter Platform-, default- und cli-Namespaces (Komponentenerweiterungen für C++).
Weitere Informationen zu safe_cast finden Sie unter:
Voraussetzungen
Compileroption: /clr
Beispiele
Beispiel
Ein Beispiel, in dem der Compiler static_cast nicht akzeptiert, aber safe_cast für Umwandlungen zwischen nicht verknüpften Schnittstellentypen akzeptiert. Mit safe_cast gibt der Compiler keinen Konvertierungsfehler aus und führt eine Überprüfung zur Laufzeit aus, um festzustellen, 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");
}
}
Ausgabe