safe_cast(C++ 组件扩展)

如果成功,safe_cast 操作会将特定表达式作为特定类型返回;否则,将引发 InvalidCastException。

所有运行时

(无适用于所有运行时的语言功能的备注。)

语法

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

Windows 运行时

safe_cast 允许更改指定表达式的类型。 如果您特别需要将一个变量或参数转换为某种特定类型时,可使用不带 try-catch 块的 safe_cast,以检测开发过程中的编程错误。 有关更多信息,请参见 Casting (C++/CX)

语法

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

参数

  • type-id
    expression 所要转换到的类型。 引用或值类型的句柄,引用或值类型的值类型或跟踪引用。

  • expression
    计算为引用或值类型的句柄,或者引用或值类型的值类型或跟踪引用的表达式。

备注

如果不能将 expression 到 type-id,指定类型safe_cast 将引发 InvalidCastException。 要捕获 InvalidCastException,请指定 /EH(异常处理模型) 编译器选项,并使用 try/catch 语句。

要求

编译器选项:/ZW

示例

示例

以下代码示例演示如何使用 safe_cast 和 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);
   }
}

Output

  

公共语言运行时

safe_cast 允许更改表达式的类型和生成可验证的 MSIL 代码。

语法

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

参数

  • type-id
    引用或值类型的句柄,引用或值类型的值类型或跟踪引用。

  • expression
    计算为引用或值类型的句柄,或者引用或值类型的值类型或跟踪引用的表达式。

备注

表达式 safe_cast< 类型 IDtype-id>( 表达式 expression) 将操作数表达式转换为类型 ID 的对象。

编译器在接受 safe_cast 的大多数情况下也将接受 static_cast。但是,要确保 safe_cast 生成可验证的 MSIL,因为 static_cast 可能会生成不可验证的 MSIL。有关可验证代码的更多信息,请参阅 纯代码和可验证代码 (C++/CLI)Peverify.exe(PEVerify 工具)

例如 static_cast,safe_cast 调用用户定义的转换。

有关转换的更多信息,请参见 强制转换运算符

safe_cast 不适用 const_cast (转换常量)。

safe_cast 在 cli 命名空间中。有关更多信息,请参见Platform、default 和 cli 命名空间(C++ 组件扩展)

有关 safe_cast 的更多信息,请参见:

要求

编译器选项:/clr

示例

示例

一个编译器不接受 static_cast,但接受 safe_cast 的示例是无关接口类型之间的强制转换。使用 safe_cast,编译器不会发布错误并将在运行时执行检查以确认该转换是否可行

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

Output

  

请参见

概念

适用于运行时平台的组件扩展