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