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