safe_cast (C++/CLI および C++/CX)safe_cast (C++/CLI and C++/CX)

safe_cast 操作は、指定された式を指定した型で返します (成功した場合)。失敗した場合は、InvalidCastException をスローします。The safe_cast operation returns the specified expression as the specified type, if successful; otherwise, throws InvalidCastException.

すべてのランタイムAll Runtimes

(この言語機能にはランタイムに適用される特記事項がありません。)(There are no remarks for this language feature that apply to all runtimes.)

構文Syntax

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

Windows ランタイムWindows Runtime

safe_cast を使用して、指定された式の型を変更できます。safe_cast allows you to change the type of a specified expression. 変数またはパラメーターを特定の型に問題なく変換できることがわかっている場合、try-catch ブロックを使用せずに safe_cast を使用して、開発中のプログラミング エラーを検出することができます。In situations where you fully expect a variable or parameter to be convertible to a certain type, you can use safe_cast without a try-catch block to detect programming errors during development. 詳細については、「キャスト (C++/CX)」を参照してください。For more information, see Casting (C++/CX).

構文Syntax

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

パラメーターParameters

type-idtype-id
変換後の expression の型。The type to convert expression to. 参照型または値型へのハンドル、値型、参照型または値型への追跡参照。A handle to a reference or value type, a value type, or a tracking reference to a reference or value type.

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

解説Remarks

safe_cast は、expressiontype-id で指定された型に変換できない場合は、InvalidCastException をスローします。InvalidCastException をキャッチするには、/EH (例外処理モデル) コンパイラ オプションを指定し、try/catch ステートメントを使用します。safe_cast throws InvalidCastException if it cannot convert expression to the type specified by type-id. To catch InvalidCastException, specify the /EH (Exception Handling Model) compiler option, and use a try/catch statement.

要件Requirements

コンパイラ オプション: /ZWCompiler option: /ZW

使用例Examples

次のコード例では、Windows ランタイムで safe_cast を使用する方法を示します。The following code example demonstrates how to use safe_cast with the Windows Runtime.

// 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 コードを生成できます。safe_cast allows you to change the type of an expression and generate verifiable MSIL code.

構文Syntax

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

パラメーターParameters

type-idtype-id
参照型または値型へのハンドル、値型、参照型または値型への追跡参照。A handle to a reference or value type, a value type, or a tracking reference to a reference or value type.

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

解説Remarks

safe_cast<type-id>(expression) は、オペランド expressiontype-id 型のオブジェクトに変換します。The expression safe_cast<type-id>(expression) converts the operand expression to an object of type type-id.

コンパイラでは、safe_cast を使用できるほとんどの場所で、safe_cast を使用できます。The compiler will accept a static_cast in most places that it will accept a safe_cast. ただし、safe_cast では確実に検証可能な MSIL が生成されますが、static_cast では検証不可能な MSIL が生成される場合があります。However, safe_cast is guaranteed to produce verifiable MSIL, where as a static_cast could produce unverifiable MSIL. 検証可能なコードの詳細については、「純粋なコードと検証可能なコード (C++/CLI)」と「Peverify.exe (PEVerify ツール)」を参照してください。See Pure and Verifiable Code (C++/CLI) and Peverify.exe (PEVerify Tool) for more information on verifiable code.

static_cast 同様、safe_cast はユーザー定義の変換を呼び出します。Like static_cast, safe_cast invokes user-defined conversions.

キャストの詳細については、「キャスト演算子」を参照してください。For more information about casts, see Casting Operators.

safe_castconst_cast (const のキャスト) を適用しません。safe_cast does not apply a const_cast (cast away const).

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

safe_cast の詳細については、以下を参照してください。For more information on safe_cast, see:

要件Requirements

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

使用例Examples

コンパイラで static_cast を使用できないが safe_cast を使用できる状況の例の 1 つは、関連していないインターフェイス型の間でのキャストです。One example of where the compiler will not accept a static_cast but will accept a safe_cast is for casts between unrelated interface types. safe_cast を使用した場合、コンパイラは変換エラーを生成せず、キャストが可能であるかどうかを実行時に検証します。With safe_cast, the compiler will not issue a conversion error and will perform a check at runtime to see if the cast is possible

// 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

関連項目See also

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