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

La operación safe_cast, si es correcta, devuelve la expresión especificada como el tipo especificado; en caso contrario, produce una InvalidCastException.

Todos los runtimes

(No hay notas para esta característica de lenguaje que se apliquen a todos los runtimes).

Sintaxis

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

Windows en tiempo de ejecución

safe_cast permite cambiar el tipo de una expresión especificada. En situaciones donde se espera claramente una variable o parámetro convertible a un tipo determinado, puede usar safe_cast sin un bloque try-catch para detectar errores de programación durante el desarrollo. Para obtener más información, consulte Convertir (C++/CX).

Sintaxis

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

Parámetros

type-id
Tipo al que se va a convertir expression. Identificador de un tipo de valor o referencia, un tipo de valor o una referencia de seguimiento a una referencia o tipo de valor.

expression
Expresión que evalúa a un identificador de un tipo de valor o referencia, un tipo de valor o una referencia de seguimiento a una referencia o tipo de valor.

Comentarios

safe_cast produce InvalidCastException si no puede convertir la expresión en el tipo especificado por type-id. Para detectar InvalidCastException, especifique la opción del compilador /EH (Modelo de control de excepciones) y use una instrucción try/catch.

Requisitos

Opción del compilador: /ZW

Ejemplos

En el ejemplo de código siguiente se muestra cómo usar 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 permite cambiar el tipo de una expresión y generar código MSIL comprobable.

Sintaxis

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

Parámetros

type-id
Identificador de un tipo de valor o referencia, un tipo de valor o una referencia de seguimiento a una referencia o tipo de valor.

expression
Expresión que evalúa a un identificador de un tipo de valor o referencia, un tipo de valor o una referencia de seguimiento a una referencia o tipo de valor.

Comentarios

La expresión safe_cast<type-id>(expression) convierte el operando expression a un objeto de tipo type-id.

El compilador aceptará un static_cast en la mayoría de los sitios en los que acepte safe_cast. Sin embargo, se garantiza safe_cast producir MSIL verificable, mientras que un static_cast MSIL podría producir MSIL no verificable. Consulte el artículo sobre el código puro y comprobable (C++/CLI) y Peverify.exe (Herramienta PEVerify) para más información sobre códigos comprobables.

Al igual que static_cast, safe_cast invoca conversiones definidas por el usuario.

Para obtener más información sobre las conversiones, consulte Operadores de conversión.

safe_cast no aplica un const_cast (desechar const).

safe_cast se encuentra en el espacio de nombres cli. Para más información, consulte Espacios de nombres de plataforma, predeterminado y CLI.

Para obtener más información sobre safe_cast, consulte:

Requisitos

Opción del compilador: /clr

Ejemplos

Un ejemplo de un sitio en el que el compilador no aceptará un static_cast pero sí un safe_cast, es en conversiones entre tipos de interfaz no relacionadas. Con safe_cast, el compilador no emitirá un error de conversión y realizará una comprobación en tiempo de ejecución para ver si tal conversión es posible.

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

Consulte también

Extensiones de componentes de .NET y UWP