Compartir a través de


safe_cast (Extensiones de componentes de C++)

La operación safe_cast devuelve la expresión especificada como el tipo especificado si se ejecuta correctamente; de lo contrario, produce 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 esperaba una variable o un parámetro para convertir en un tipo determinado, puede utilizar safe_cast sin un bloque try-catch para detectar errores de programación durante el desarrollo. Para obtener más información, vea Versión (C++/CX).

Sintaxis

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

Parámetros

  • type-id
    Tipo en el que convertir expression. Un identificador de una referencia o tipo de valor, un tipo de valor o una referencia de seguimiento a una referencia o tipo de valor.

  • expression
    Una expresión que se evalúa como un identificador para una referencia o un tipo de valor, 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 expression al 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

Ejemplo

En el ejemplo de código siguiente se muestra cómo se utiliza safe_cast con Windows en tiempo de ejecución.

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

Resultados

  

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
    Un identificador de una referencia o tipo de valor, un tipo de valor o una referencia de seguimiento a una referencia o tipo de valor.

  • expression
    Una expresión que se evalúa como un identificador para una referencia o un tipo de valor, 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 la expresión de operando a un objeto de tipo- identificador escrito.

El compilador aceptará static_cast en la mayoría de los lugares que aceptará safe_cast. Sin embargo, safe_cast se garantiza que genera MSIL comprobable, mientras que static_cast podría generar MSIL no comprobable. Vea Código puro y comprobable (C++/CLI) y Peverify.exe (Herramienta PEVerify) para obtener más código comprobable.

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

Para obtener más información acerca de las conversiones, vea Operadores de conversión.

safe_cast no aplica const_cast (desecha const).

safe_cast está en el espacio de nombres cli. Para obtener más información, vea Espacios de nombres de plataforma, predeterminado y CLI (Extensiones de componentes de C++).

Para obtener más información acerca de safe_cast, vea:

Requisitos

Opción del compilador: /clr

Ejemplos

Ejemplo

Un ejemplo de dónde el compilador no aceptará static_cast, pero aceptará safe_cast, son las conversiones entre los tipos de interfaz sin relación. 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 la 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");
   }
}

Resultados

  

Vea también

Conceptos

Extensiones de componentes para plataformas de tiempo de ejecución