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