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)
参照型または値型へのハンドル、値型、参照型または値型への追跡参照として評価される式。

解説

safe_cast は、type-id で指定された型に変換できない場合に 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) は、オペランド expressiontype-id 型のオブジェクトに変換します。

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

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

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

safe_castconst_cast を適用しません (const を打ち消します)。

safe_cast は cli 名前空間に存在します。 詳細については、「Platform, default, and cli Namespaces (プラットフォーム、既定、および cli 名前空間)」を参照してください。

safe_cast の詳細については、以下を参照してください。

要件

コンパイラ オプション: /clr

コンパイラで 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");
   }
}
Caught expected exception

関連項目

.NET および UWP でのコンポーネント拡張