Compartilhar via


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

A safe_cast operação retorna a expressão especificada como o tipo especificado. Se a operação não for bem-sucedida, ela gerará um InvalidCastException.

All Runtimes

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

Syntax

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

Tempo de Execução do Windows

Use safe_cast para alterar o tipo de uma expressão especificada. If you expect a variable or parameter to be convertible to a certain type, use safe_cast without a try-catch block to detect programming errors during development. For more information, see Casting (C++/CX).

Syntax

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

Parameters

type-id
The type to convert expression to. 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.

expression
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.

Remarks

safe_cast throws InvalidCastException if it can't convert expression to the type specified by type-id. To catch InvalidCastException, specify the /EH (Exception Handling Model) compiler option, and use a try/catch statement.

Requirements

Opção do compilador: /ZW

Examples

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

Tempo de Execução da Linguagem Comum

safe_cast altera o tipo de uma expressão e gera um código MSIL verificável.

Syntax

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

Parameters

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.

expression Uma expressão que é avaliada como um identificador para um tipo de referência ou valor, um tipo de valor ou uma referência de acompanhamento para um tipo de referência ou valor.

Remarks

The expression safe_cast<type-id>(expression) converts the operand expression to an object of type type-id.

O compilador aceita um static_cast na maioria dos lugares em que aceita um safe_cast. No entanto, safe_cast sempre produz MSIL verificável, enquanto um static_cast MSIL pode produzir MSIL inverificável. Para obter mais informações sobre código verificável, consulte Código Puro e Verificável (C++/CLI) e Peverify.exe (Ferramenta PEVerify).

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

For more information about casts, see Casting Operators.

safe_cast não aplica um const_cast (cast away const).

safe_cast está no namespace da CLI. Para obter mais informações, consulte Namespaces de plataforma, padrão e cli.

Para obter mais informações sobre safe_cast, consulte:

Requirements

Opção do compilador: /clr

Examples

Um exemplo de onde o compilador não aceita um static_cast , mas aceita um safe_cast é para conversões entre tipos de interface não relacionados. Com safe_cast, o compilador não emite um erro de conversão e executa uma verificação no 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

See also

Extensões de componentes para .NET e UWP