Condividi tramite


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

L'operazione safe_cast restituisce l'espressione specificata come tipo specificato. Se l'operazione non riesce, genera un'eccezione InvalidCastException.

All Runtimes

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

Syntax

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

Windows Runtime

Usare safe_cast per modificare il tipo di un'espressione specificata. If you expect a variable or parameter to be convertible to a certain type, use safe_cast without a try-catch block to detect programming errors during development. For more information, see Casting (C++/CX).

Syntax

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

Parameters

type-id
The type to convert expression to. 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.

Remarks

safe_cast throws InvalidCastException if it can't convert expression to the type specified by type-id. To catch InvalidCastException, specify the /EH (Exception Handling Model) compiler option, and use a try/catch statement.

Requirements

Opzione del compilatore: /ZW

Examples

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

Runtime del Linguaggio Comune (Common Language Runtime)

safe_cast modifica il tipo di un'espressione e genera codice MSIL verificabile.

Syntax

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

Parameters

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 un tipo riferimento o valore, a un tipo valore o a un riferimento di rilevamento a un tipo riferimento o valore.

Remarks

The expression safe_cast<type-id>(expression) converts the operand expression to an object of type type-id.

Il compilatore accetta un oggetto static_cast nella maggior parte delle posizioni in cui accetta un oggetto safe_cast. Tuttavia, safe_cast produce sempre MSIL verificabile, mentre un static_cast oggetto potrebbe produrre MSIL non verificabile. Per altre informazioni sul codice verificabile, vedere Codice puro e verificabile (C++/CLI) e Peverify.exe (strumento PEVerify).

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

For more information about casts, see Casting Operators.

safe_cast non applica un oggetto const_cast (cast away const).

safe_cast è nello spazio dei nomi dell'interfaccia della riga di comando. Per altre informazioni, vedere Spazi dei nomi della piattaforma, delle impostazioni predefinite e dell'interfaccia della riga di comando.

Per altre informazioni su safe_cast, vedere:

Requirements

Opzione del compilatore: /clr

Examples

Un esempio di dove il compilatore non accetta un oggetto static_cast ma accetta 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 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");
   }
}
Caught expected exception

See also

Estensioni componenti per .NET e UWP