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