Freigeben über


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

  

Siehe auch

Konzepte

Komponentenerweiterungen für Laufzeitplattformen