Partilhar via


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

A operação safe_cast retorna a expressão especificada como o tipo especificado, se bem-sucedida; caso contrário, lança InvalidCastException.

Todos os Runtimes

(Não há comentários para esse recurso de linguagem que se apliquem a todos os runtimes.)

Sintaxe

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

Windows Runtime

safe_cast permite alterar o tipo de uma expressão especificada. Em situações em que você espera que uma variável ou parâmetro seja conversível em um determinado tipo, é possível usar safe_cast sem um bloco try-catch para detectar erros de programação durante o desenvolvimento. Saiba mais em Conversão (C++/CX).

Sintaxe

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

Parâmetros

type-id
O tipo para o qual converter a expression. Um identificador para um tipo de referência ou de valor, um tipo de valor ou uma referência de acompanhamento para um tipo de referência ou de valor.

expressão
Uma expressão que avalia um identificador para um tipo de referência ou de valor, um tipo de valor ou uma referência de acompanhamento para um tipo de referência ou de valor.

Comentários

safe_cast gerará InvalidCastException se não puder converter expression para o tipo especificado pela type-ID. Para capturar InvalidCastException, especifique a opção do compilador /EH (modelo de tratamento de exceções) e use uma instrução try/catch.

Requisitos

Opção do compilador: /ZW

Exemplos

O exemplo de código a seguir demonstra como usar safe_cast com o 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 que você altere o tipo de uma expressão e gere o código MSIL verificável.

Sintaxe

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

Parâmetros

type-id
Um identificador para um tipo de referência ou de valor, um tipo de valor ou uma referência de acompanhamento para um tipo de referência ou de valor.

expressão
Uma expressão que avalia um identificador para um tipo de referência ou de valor, um tipo de valor ou uma referência de acompanhamento para um tipo de referência ou de valor.

Comentários

A expressão safe_cast<type-id>(expression) converte o operando expression em um objeto do tipo type-id.

O compilador aceitará um static_cast na maioria dos lugares que aceitará um safe_cast. No entanto, safe_cast é garantido para produzir MSIL verificável, enquanto a static_cast pode produzir MSIL não verificável. Consulte Código puro e verificável (C++/CLI) e Peverify.exe (Ferramenta PEVerify) para saber mais sobre código verificável.

Assim como static_cast, safe_cast invoca conversões definidas pelo usuário.

Saiba mais sobre conversões em Operadores de conversão.

safe_cast não se aplica a const_cast (conversão de const).

safe_cast está no namespace da CLI. Saiba mais em Namespaces da CLI, de plataforma e padrão.

Saiba mais sobre safe_cast em:

Requisitos

Opção do compilador: /clr

Exemplos

As conversões entre tipos de interface não relacionados são um exemplo de quando o compilador não aceitará static_cast, mas aceitará safe_cast. Com safe_cast, o compilador não emitirá um erro de conversão e executará uma verificação em runtime para ver se a conversão é possível.

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

Confira também

Extensões de componentes para .NET e UWP