safe_cast (C++ コンポーネント拡張)
safe_cast 操作は、指定された式を指定した型で返します (成功した場合)。失敗した場合は、InvalidCastException をスローします。
All Runtimes
(この言語機能にはランタイムに適用される特記事項がありません。)
Syntax
[default]::safe_cast<type-id>(expression)
Windows ランタイム
safe_cast を使用して、指定された式の型を変更することができます。変数またはパラメーターを特定の型に問題なく変換できることがわかっている場合、try-catch ブロックを使用せずに safe_cast を使用して、開発中のプログラミング エラーを検出することができます。詳細については、「キャスト (C++/CX)」を参照してください。
Syntax
[default]::safe_cast<type-id>(expression)
Parameters
type-id
expression の変換後の型。参照型または値型へのハンドル、値型、または参照型または値型への追跡参照。expression
参照型または値型へのハンドル、値型、または参照型または値型への追跡参照として評価される式。
解説
type-id で指定された型に expression を変換できなかった場合、safe_cast は InvalidCastException をスローします。InvalidCastException をキャッチするには、/EH (例外処理モデル) コンパイラ オプションを指定し、try/catch ステートメントを使用します。
要件
Compiler option: /ZW
例
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 コードを生成することができます。
Syntax
[cli]::safe_cast<type-id>(expression)
Parameters
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.
解説
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_cast は const_cast (const のキャスト) を適用しません。
safe_cast は cli 名前空間に存在します。詳細については、「プラットフォーム、既定、および cli 名前空間 (C++ コンポーネント拡張)」を参照してください。
safe_cast の詳細については、次のページを参照してください。
要件
Compiler option: /clr
例
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");
}
}
出力