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 InvalidCastExceptiondie 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_castruft 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

Siehe auch

Komponentenerweiterungen für .NET und UWP