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