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

如果成功,safe_cast 操作返回指定表达式作为指定类型;否则,抛出 InvalidCastException

所有运行时

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

语法

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

Windows 运行时

使用 safe_cast,可以更改指定表达式的类型。 在完全期望变量或参数可转换为特定类型的情况下,可以使用不含 try-catch 块的 safe_cast,以在开发过程中检测编程错误。 有关详细信息,请参阅强制转换 (C++/CX)

语法

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

参数

type-id
要将 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);
   }
}
Caught expected exception: InvalidCastException

公共语言运行时

使用 safe_cast,可以更改表达式的类型,并生成可验证的 MSIL 代码。

语法

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

参数

type-id
引用或值类型的句柄、值类型或是对引用或值类型的跟踪引用。

expression
一个表达式,计算结果是引用或值类型的句柄、值类型或是对引用或值类型的跟踪引用。

备注

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

在大多数接受 safe_cast 的情况下,编译器也接受 static_cast。 但是,safe_cast 可保证生成可验证的 MSIL,而 static_cast 则可能会生成无法验证的 MSIL。 若要详细了解可验证的代码,请参阅纯代码和可验证的代码 (C++/CLI)Peverify.exe(PEVerify 工具)

static_cast 一样,safe_cast 调用用户定义转换

若要详细了解强制转换,请参阅强制转换运算符

safe_cast 不应用 const_cast(强制转换掉 const

safe_cast 位于 cli 命名空间中。 有关详细信息,请参阅平台默认 cli 命名空间

若要详细了解 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");
   }
}
Caught expected exception

另请参阅

.NET 和 UWP 的组件扩展