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)
は、オペランド expression を type-id 型のオブジェクトに変換します。
コンパイラでは、safe_cast を使用できるほとんどの場所で、safe_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, 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