Condividi tramite


safe_cast (Estensioni del componente C++)

L'operazione safe_cast restituisce l'espressione specificata del tipo specificato, in caso positivo; in caso contrario, viene generata una 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. Laddove si richiede che una variabile o un parametro debba essere convertibile in un determinato tipo, è possibile utilizzare il safe_cast senza un blocco try-catch per rilevare gli errori di programmazione durante lo sviluppo. Per ulteriori informazioni, vedere Casting (C++/CX).

Sintassi

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

Parametri

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

  • expression
    Un'espressione che viene valutata in un handle a un riferimento o a un tipo di valore, un tipo di valore, o un riferimento di rilevamento a un riferimento o a un tipo di valore.

Osservazioni

safe_cast genera InvalidCastException se non è possibile convertire expression nel tipo specificato da type-id. Per intercettare una InvalidCastException, specificare l'opzione del compilatore /EH (Modello di gestione delle eccezioni) e utilizzare un'istruzione try/catch.

Requisiti

Opzione del compilatore: /ZW

Esempi

Esempio

Nell'esempio di codice riportato di seguito viene illustrato l'utilizzo di 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);
   }
}

Output

  

Common Language Runtime

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

Sintassi

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

Parametri

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

  • expression
    Un'espressione che viene valutata in un handle a un riferimento o a un tipo di valore, un tipo di valore, o un riferimento di rilevamento a un riferimento o a un tipo di valore.

Osservazioni

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

Il compilatore accetta un static_cast nella maggior parte dei posti in cui viene accettato un safe_cast. Tuttavia, safe_cast produce sicuramente codice MSIL verificabile, mentre static_cast potrebbe produrre codice non MSIL verificabile. Vedere le pagine Codice pure e verificabile (C++/CLI) e Peverify.exe (strumento PEVerify) per ulteriori informazioni sul codice verificabile.

Come static_cast, safe_cast utilizza le conversioni definite dall'utente.

Per ulteriori informazioni sui cast, vedere la pagina Operatori di cast.

safe_cast non applica un const_cast (cast evita const).

safe_cast è nello spazio dei nomi cli. Per ulteriori informazioni, vedere Spazi dei nomi Platform, default e cli (Estensioni del componente C++).

Per ulteriori informazioni su safe_cast, vedere:

Requisiti

Opzione del compilatore: /clr

Esempi

Esempio

Un esempio in cui il compilatore non accetta un static_cast ma accetta un safe_cast è per i cast tra tipi di interfacce indipendenti. Con safe_cast, il compilatore non genererà un errore di conversione ed eseguirà un controllo in fase di esecuzione per verificare se il cast è possibile

// 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");
   }
}

Output

  

Vedere anche

Concetti

Estensioni componenti per le piattaforme runtime