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
範例
範例
下列程式碼範例示範如何使用搭配 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);
}
}
Output
Common Language Runtime
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 命名空間中。如需詳細資訊,請參閱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