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

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。 如需可驗證程式碼的詳細資訊,請參閱純粹的和可驗證的程式碼Peverify.exe (PEVerify 工具)

如同 static_castsafe_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 的元件延伸模組