safe_cast(C++ 组件扩展)
safe_cast 操作返回指定的表达式,指定类型,因此,如果成功;否则,将引发 InvalidCastException。
所有运行时
(不适用于所有运行时间。) 此语言功能的备注
语法
[default]::safe_cast<type-id>(expression)
Windows 运行时
safe_cast 可以更改一个指定表达式的类型。
语法
[default]::safe_cast<type-id>(expression)
参数
类型 ID
转换 表达式 的类型。 所引用的句柄或值类型,值类型或跟踪对引用或值类型。表达式
计算为句柄引用或值类型的表达式,值类型或跟踪对引用或值类型。
备注
返回;如果未能转换 表达式 为 类型 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)
参数
类型 ID
所引用的句柄或值类型,值类型或跟踪对引用或值类型。表达式
计算为句柄引用或值类型的表达式,值类型或跟踪对引用或值类型。
备注
该表达式 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 的更多信息,请参见:
要求
编译器选项:/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