Share via


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

In caso di esito positivo, l'operazione safe_cast restituisce l'espressione specificata come tipo specificato. In caso contrario, genera un'eccezione InvalidCastException.

Tutti i runtime

Non esistono note per questa funzionalità del linguaggio che si applichino a tutti i runtime.

Sintassi

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

Windows Runtime

safe_cast consente di modificare il tipo di un'espressione specificata. In situazioni in cui si prevede che una variabile o un parametro sia convertibile in un determinato tipo, è possibile usare safe_cast senza un blocco try-catch per rilevare errori di programmazione durante lo sviluppo. Per altre informazioni, vedere Cast (C++/CX).

Sintassi

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

Parametri

type-id
Tipo in cui convertire expression. Handle a un tipo riferimento o valore, un tipo valore oppure un riferimento di rilevamento a un tipo riferimento o valore.

expression
Espressione che restituisce un handle a tipo riferimento o valore oppure un riferimento di rilevamento a un tipo riferimento o valore.

Osservazioni:

safe_cast genera un'eccezione InvalidCastException se non è in grado di convertire l'espressione nel tipo specificato da type-id. Per intercettare InvalidCastException, specificare l'opzione del compilatore /EH (modello di gestione delle eccezioni) e usare un'istruzione try/catch.

Requisiti

Opzione del compilatore: /ZW

Esempi

L'esempio di codice seguente illustra come usare safe_cast con 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

Common Language Runtime

safe_cast consente di modificare il tipo di un'espressione e di generare codice MSIL verificabile.

Sintassi

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

Parametri

type-id
Handle a un tipo riferimento o valore, un tipo valore oppure un riferimento di rilevamento a un tipo riferimento o valore.

expression
Espressione che restituisce un handle a tipo riferimento o valore oppure un riferimento di rilevamento a un tipo riferimento o valore.

Osservazioni:

L'espressione safe_cast<type-id>(expression) converte l'operando expression in un oggetto di tipo type-id.

Il compilatore accetta static_cast nella maggior parte delle posizioni in cui accetta safe_cast. Tuttavia, safe_cast è garantito di produrre MSIL verificabile, mentre un potrebbe static_cast produrre MSIL non verificabile. Vedere Codice pure e verificabile (C++/CLI) e Peverify.exe (strumento PEVerify) per altre informazioni sul codice verificabile.

Come static_cast, safe_cast richiama conversioni definite dall'utente.

Per altre informazioni sui cast, vedere Operatori di cast.

safe_cast non applica un oggetto const_cast (cast awayconst).

safe_cast si trova nello spazio dei nomi cli. Per altre informazioni, vedere Spazi dei nomi Platform, default e cli.

Per altre informazioni su safe_cast, vedere:

Requisiti

Opzione del compilatore: /clr

Esempi

Un esempio di dove il compilatore non accetterà un oggetto static_cast ma accetterà un safe_cast è per i cast tra tipi di interfaccia non correlati. Con safe_cast, il compilatore non genera un errore di conversione ed esegue un controllo in fase di runtime per verificare se è possibile eseguire il cast

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

Vedi anche

Estensioni componenti per .NET e UWP