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
範例
下列程式碼範例示範如何搭配 Windows 執行階段使用 safe_cast。
// 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。 如需可驗證程式碼的詳細資訊,請參閱純粹的和可驗證的程式碼和 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