Udostępnij za pośrednictwem


safe_cast (C++/CLI i C++/CX)

Operacja safe_cast zwraca określone wyrażenie jako określony typ, jeśli się powiedzie; w przeciwnym razie zgłasza wartość InvalidCastException.

Wszystkie środowiska wykonawcze

(Nie ma żadnych uwag dotyczących tej funkcji językowej, która ma zastosowanie do wszystkich środowisk uruchomieniowych).

Składnia

[default]:: safe_cast< type-id >( expression )

Środowisko wykonawcze systemu Windows

safe_cast umożliwia zmianę typu określonego wyrażenia. W sytuacjach, w których w pełni oczekujesz, że zmienna lub parametr mają być konwertowane na określony typ, można użyć safe_cast bez bloku try-catch w celu wykrywania błędów programowania podczas programowania. Aby uzyskać więcej informacji, zobacz Casting (C++/CX).

Składnia

[default]:: safe_cast< type-id >( expression )

Parametry

type-id
Typ, na który ma być konwertowane wyrażenie . Dojście do typu odwołania lub wartości, typu wartości lub odwołania śledzenia do typu odwołania lub wartości.

wyrażenie
Wyrażenie, które oblicza dojście do typu odwołania lub wartości, typu wartości lub odwołania śledzenia do typu odwołania lub wartości.

Uwagi

safe_cast zgłasza, InvalidCastException jeśli nie może przekonwertować wyrażenia na typ określony przez identyfikator typu. Aby przechwycić InvalidCastException, określ /EH (model obsługi wyjątków) kompilator i użyj instrukcji try/catch.

Wymagania

Opcja kompilatora: /ZW

Przykłady

W poniższym przykładzie kodu pokazano, jak używać safe_cast z środowisko wykonawcze systemu Windows.

// 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

środowiska uruchomieniowe w trakcie wykonania

safe_cast umożliwia zmianę typu wyrażenia i generowanie weryfikowalnego kodu MSIL.

Składnia

[cli]:: safe_cast< type-id >( expression )

Parametry

type-id
Dojście do typu odwołania lub wartości, typu wartości lub odwołania śledzenia do typu odwołania lub wartości.

wyrażenie
Wyrażenie, które oblicza dojście do typu odwołania lub wartości, typu wartości lub odwołania śledzenia do typu odwołania lub wartości.

Uwagi

Wyrażenie safe_cast<)type-id>(konwertuje wyrażenie operand na obiekt typu type-id.

Kompilator zaakceptuje static_cast w większości miejsc, które zaakceptuje safe_cast. Jednak safe_cast gwarantuje uzyskanie weryfikowalnego MSIL, podczas gdy może static_cast to spowodować niezweryfikowalne MSIL. Aby uzyskać więcej informacji na temat weryfikowalnego kodu (C++/CLI), zobacz Artykuł Pure and Verifiable Code (C++/CLI) i Peverify.exe (PEVerify Tool).

Podobnie jak static_cast, safe_cast wywołuje konwersje zdefiniowane przez użytkownika.

Aby uzyskać więcej informacji na temat rzutów, zobacz Casting Operators (Operatory rzutów).

safe_cast nie stosuje obiektu (odrzuć const_cast const).

safe_cast znajduje się w przestrzeni nazw interfejsu wiersza polecenia. Aby uzyskać więcej informacji, zobacz Przestrzenie nazw platformy, domyślne i interfejsu wiersza polecenia.

Aby uzyskać więcej informacji na temat safe_cast, zobacz:

Wymagania

Opcja kompilatora: /clr

Przykłady

Jednym z przykładów, w których kompilator nie zaakceptuje elementu static_cast , ale zaakceptuje safe_cast jest rzutowanie między niepowiązanymi typami interfejsów. W przypadku safe_cast kompilator nie wystawi błędu konwersji i wykona sprawdzanie w czasie wykonywania, aby sprawdzić, czy rzutowanie jest możliwe

// 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

Zobacz też

Rozszerzenia składników dla platformy .NET i platformy uniwersalnej systemu Windows