共用方式為


safe_cast (C++ 元件擴充功能)

如果成功,則 safe_cast 作業會將指定的運算式傳回為指定的型別,否則擲回 InvalidCastException。

所有執行階段

(這個語言功能沒有適用於所有執行階段的備註)。

23b7yy6w.collapse_all(zh-tw,VS.110).gif語法

[default]::safe_cast<type-id>(expression)

Windows 執行階段

safe_cast 可讓您變更指定之運算式的型別。 在您完全預期變數或參數可以轉換為特定型別的情況下,您可以使用沒有 try-catch 區塊的 safe_cast 來偵測開發期間的程式設計錯誤。 如需詳細資訊,請參閱轉型 (C++/CX)

23b7yy6w.collapse_all(zh-tw,VS.110).gif語法

[default]::safe_cast<type-id>(expression)

23b7yy6w.collapse_all(zh-tw,VS.110).gif參數

  • type-id
    要將 expression 轉換成的型別。 參考或實值型別的控制代碼、實值型別,或者參考或實值型別的追蹤參考。

  • expression
    運算式,這會評估為參考或實值型別的控制代碼、實值型別,或者參考或實值型別的追蹤參考。

23b7yy6w.collapse_all(zh-tw,VS.110).gif備註

如果 safe_cast 無法將運算式轉換為 type-id 所指定的型別,就會擲回 InvalidCastException。 若要攔截 InvalidCastException,請指定 /EH (例外狀況處理模型) 編譯器選項,並使用 try/catch 陳述式。

23b7yy6w.collapse_all(zh-tw,VS.110).gif需求

編譯器選項:/ZW

23b7yy6w.collapse_all(zh-tw,VS.110).gif範例

範例

下列程式碼範例示範如何使用搭配 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 程式碼。

23b7yy6w.collapse_all(zh-tw,VS.110).gif語法

[cli]::safe_cast<type-id>(expression)

23b7yy6w.collapse_all(zh-tw,VS.110).gif參數

  • type-id
    參考或實值型別的控制代碼、實值型別,或者參考或實值型別的追蹤參考。

  • expression
    運算式,這會評估為參考或實值型別的控制代碼、實值型別,或者參考或實值型別的追蹤參考。

23b7yy6w.collapse_all(zh-tw,VS.110).gif備註

運算式 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 的詳細資訊,請參閱:

23b7yy6w.collapse_all(zh-tw,VS.110).gif需求

編譯器選項:/clr

23b7yy6w.collapse_all(zh-tw,VS.110).gif範例

範例

例如,編譯器不會接受 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

  

請參閱

概念

執行階段平台的元件擴充功能