Compartilhar via


safe_cast (Extensões de Componentes C++)

A operação safe_cast retorna a expressão especificada como o tipo especificado, se tiver êxito; caso contrário, lança InvalidCastException.

Todos os Tempos de Execução

(Não há nenhum comentário sobre este recurso de linguagem que se aplica a todos os tempos de execução).

Sintaxe

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

Tempo de Execução do Windows

safe_cast permite que você altere o tipo de uma expressão especificada. Em situações onde você só espera uma variável ou um parâmetro a ser conversível para um determinado tipo, poderá usar safe_cast sem um bloco try-catch para detectar erros de programação durante o desenvolvimento. Para obter mais informações, consulte A conversão (C++/CX).

Sintaxe

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

Parâmetros

  • type-id
    O tipo para converter expression a. Um manipulador para um tipo de referência ou de valor, ou uma referência de controle para um tipo de referência ou de valor.

  • expression
    Uma expressão avaliada para um manipulador para um tipo de referência ou de valor, ou uma referência de controle para um tipo de referência ou de valor.

Comentários

safe_cast gerencie InvalidCastException se não pode converter expression o tipo especificado por type-id. Para capturar InvalidCastException, especifique a opção de compilador /EH (modelo de tratamento de exceções) e use uma instrução try/catch.

Requisitos

Opção do compilador: /ZW

Exemplos

Exemplo

O código a seguir demonstra como usar safe_cast com o Tempo de Execução do Windows.

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

Saída

  

Common Language Runtime

safe_cast permite que você altere o tipo de uma expressão e gere código MSIL verificável.

Sintaxe

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

Parâmetros

  • type-id
    Um manipulador para um tipo de referência ou de valor, ou uma referência de controle para um tipo de referência ou de valor.

  • expression
    Uma expressão avaliada para um manipulador para um tipo de referência ou de valor, ou uma referência de controle para um tipo de referência ou de valor.

Comentários

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

O compilador aceitará um static_cast na maioria dos locais que aceitem um safe_cast. No entanto, é garantido que safe_cast produza um MSIL verificável, onde como um static_cast poderia produzir MSIL não verificável. Consulte Código puro e verificável (C++/CLI) e Peverify.exe (Ferramenta PEVerify) para obter mais informações sobre código verificável.

Como static_cast, safe_cast chama conversões definidas pelo usuário.

Para obter mais informações sobre conversões, consulte Operadores de conversão.

safe_cast não aplica um const_cast (const rejeitado).

safe_cast está no namespace cli. Consulte Namespaces Plataforma, padrão e cli (Extensões de Componentes C++) para maiores informações.

Para obter informações sobre safe_cast, consulte:

Requisitos

Opção do compilador: /clr

Exemplos

Exemplo

Um exemplo de onde o compilador não aceitará static_cast mas aceitará safe_cast é para conversões entre tipos de interface não relacionados. Com o safe_cast, o compilador não emitirá um erro de conversão e executará uma verificação em tempo de execução 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");
   }
}

Saída

  

Consulte também

Conceitos

Extensões de componente para plataformas de tempo de execução