safe_cast(C++ 组件扩展)

safe_cast 操作返回指定的表达式,指定类型,因此,如果成功;否则,将引发 InvalidCastException。

所有运行时

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

23b7yy6w.collapse_all(zh-cn,VS.110).gif语法

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

Windows 运行时

safe_cast 可以更改一个指定表达式的类型。

23b7yy6w.collapse_all(zh-cn,VS.110).gif语法

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

23b7yy6w.collapse_all(zh-cn,VS.110).gif参数

  • 类型 ID
    转换 表达式 的类型。 所引用的句柄或值类型,值类型或跟踪对引用或值类型。

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

23b7yy6w.collapse_all(zh-cn,VS.110).gif备注

返回;如果未能转换 表达式 为 类型 ID,指定的类型safe_cast 引发 InvalidCastException。 若要捕获 InvalidCastException,请指定 /EH(异常处理模型) 编译器选项,并使用 try/catch 语句。

23b7yy6w.collapse_all(zh-cn,VS.110).gif要求

编译器选项:/ZW

23b7yy6w.collapse_all(zh-cn,VS.110).gif示例

示例

下面的代码示例演示如何使用 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 代码。

23b7yy6w.collapse_all(zh-cn,VS.110).gif语法

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

23b7yy6w.collapse_all(zh-cn,VS.110).gif参数

  • 类型 ID
    所引用的句柄或值类型,值类型或跟踪对引用或值类型。

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

23b7yy6w.collapse_all(zh-cn,VS.110).gif备注

该表达式 safe_cast<类型 ID>(表达式) 转换操作数表达式转换为类型 ID 对象。

编译器大多数地方将接受 static_cast 它将接受 safe_cast。 但是,safe_cast 确保生成可验证的 MSIL,作为 static_cast 可能会生成不可验证的 MSIL。 请参见 纯代码和可验证代码 (C++/CLI)Peverify.exe(PEVerify 工具) 有关可验证的代码的更多信息。

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

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

safe_cast 不适用 const_cast (转换 const)。

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

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

23b7yy6w.collapse_all(zh-cn,VS.110).gif要求

编译器选项:/clr

23b7yy6w.collapse_all(zh-cn,VS.110).gif示例

示例

编译器不会接受 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

  

请参见

概念

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