Share via


safe_cast (C++ コンポーネント拡張)

safe_cast 操作は、指定された式を指定した型で返します (成功した場合)。失敗した場合は、InvalidCastException をスローします。

All Runtimes

(この言語機能にはランタイムに適用される特記事項がありません。)

23b7yy6w.collapse_all(ja-jp,VS.110).gifSyntax

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

Windows ランタイム

safe_cast を使用して、指定された式の型を変更することができます。変数またはパラメーターを特定の型に問題なく変換できることがわかっている場合、try-catch ブロックを使用せずに safe_cast を使用して、開発中のプログラミング エラーを検出することができます。詳細については、「キャスト (C++/CX)」を参照してください。

23b7yy6w.collapse_all(ja-jp,VS.110).gifSyntax

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

23b7yy6w.collapse_all(ja-jp,VS.110).gifParameters

  • type-id
    expression の変換後の型。参照型または値型へのハンドル、値型、または参照型または値型への追跡参照。

  • expression
    参照型または値型へのハンドル、値型、または参照型または値型への追跡参照として評価される式。

23b7yy6w.collapse_all(ja-jp,VS.110).gif解説

type-id で指定された型に expression を変換できなかった場合、safe_cast は InvalidCastException をスローします。InvalidCastException をキャッチするには、/EH (例外処理モデル) コンパイラ オプションを指定し、try/catch ステートメントを使用します。

23b7yy6w.collapse_all(ja-jp,VS.110).gif要件

Compiler option: /ZW

23b7yy6w.collapse_all(ja-jp,VS.110).gif

Example

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);
   }
}

出力

  

共通言語ランタイム

safe_cast を使用して、指定された式の型を変更し、検証可能な MSIL コードを生成することができます。

23b7yy6w.collapse_all(ja-jp,VS.110).gifSyntax

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

23b7yy6w.collapse_all(ja-jp,VS.110).gifParameters

  • type-id
    A handle to a reference or value type, a value type, or a tracking reference to a reference or value type.

  • expression
    An expression that evaluates to a handle to a reference or value type, a value type, or a tracking reference to a reference or value type.

23b7yy6w.collapse_all(ja-jp,VS.110).gif解説

safe_cast<type-id>(expression) という式を使用すると、オペランド式が type-id という型のオブジェクトに変換されます。

safe_cast を使用できるほとんどの場所で、static_cast を使用できます。ただし、safe_cast では確実に検証可能な MSIL が生成されますが、static_cast では検証不可能な MSIL が生成される場合があります。検証可能なコードの詳細については、「純粋なコードと検証可能なコード (C++/CLI)」および「Peverify.exe (PEVerify ツール)」を参照してください。

static_cast と同様に、safe_cast はユーザー定義の変換を呼び出します。

キャストの詳細については、「キャスト演算子」を参照してください。

safe_castconst_cast (const のキャスト) を適用しません。

safe_cast は cli 名前空間に存在します。詳細については、「プラットフォーム、既定、および cli 名前空間 (C++ コンポーネント拡張)」を参照してください。

safe_cast の詳細については、次のページを参照してください。

23b7yy6w.collapse_all(ja-jp,VS.110).gif要件

Compiler option: /clr

23b7yy6w.collapse_all(ja-jp,VS.110).gif

Example

static_cast を使用できないが safe_cast を使用できる状況の例の 1 つは、関連していないインターフェイス型の間でのキャストです。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");
   }
}

出力

  

参照

概念

ランタイム プラットフォームのコンポーネントの拡張機能