C#のis演算子とas演算子で型テストとキャストを行う

C# is演算子とas演算子

オブジェクトを他のオブジェクトにキャストして代入する時には、オブジェクトの型を変換する必要がでてきます。
C#には、オブジェクトの型を比較する演算子と、オブジェクトを別の型に変換するための演算子が用意されています。

今回の記事は、C#に用意されている比較演算子(型テスト演算子)の「is演算子」と変換演算子(型キャスト演算子)の「as演算子」について記載します。

is演算子

is演算子とは

is演算子は2つのオブジェクトを比較し、変換可能であるかどうかを取得する型テスト演算子です。
「a is B」でaがB型に代入可能かどうか(aがBであるかどうか)をbool型の論理値(True/False)で返します。

is演算子では式(変数などのインスタンス)と、指定された型(クラスなどの定義)の間に互換性があるかどうかが調べられます。
is演算子の型テストを使用する式の形式(構文)は次のとおりです

as演算子

as演算子とは

as演算子はオブジェクトを別の型のオブジェクトに変換するキャスト演算子です。
「a as B」でaをB型に変換したオブジェクト(Bとしてのaオブジェクト)を返します。

as演算子のキャストを使用する式の形式(構文)は次のとおりです

キャスト演算子の()でキャストを行った場合、型変換ができない場合に例外が発生しますが、as演算子でキャストを行った場合は例外が発生せず、変数にnullが代入されます。

is演算子のパターンマッチング

C#7.0以降のis演算子では、パターンマッチングがサポートされており、パターンに対する式の結果のテストも行われます。

パターンマッチングを使用する型テスト

パターンマッチングには「型パターン」「定数パターン」「varパターン」の3種類があります。

型パターン

型パターンを使用してパターンマッチングを実行すると、式を指定された型に変換できるかどうかが、is演算子によってテストされます。
テストの結果、変換できる場合はその型の変数にキャストされます。
型パターンは次の形式(構文)で利用できます。

定数パターン

定数パターンを使用してパターンマッチングを実行すると、式が指定された定数と等しいかどうかが、is演算子によってテストされます。
定数パターンは次の形式(構文)で利用できます。

定数パターンを使用して、nullのチェックを行うこともできます。

varパターン

varパターンは、すべての型または値に対応します。
is演算子の左辺の式(変数)は、コンパイル時の型と同じ型のローカル変数に割り当てられます。
is演算子の式の結果は常にTrueを返します。
varパターンは次の形式(構文)で利用できます。

varパターンではexpressionがnullの場合に、is演算子がTrueを返します。
型パターンでは指定された型に変換可能であっても、expressionがnullの場合には、is演算子はFalseを返します。

is演算子のパターンマッチングを使うと、as演算子を使わずにオブジェクトの変数へキャストした値を代入することができます。

サンプルプログラム

コンソールアプリケーションを使って、is演算子とas演算子の動作を確認するサンプルプログラムを作成します。

ソースコード

サンプルプログラムの実行

作成したプロジェクトをビルドして実行(デバッグ)します。

C#のis演算子とas演算子のコンソールプログラムサンプルの実行結果ウィンドウ

is演算子を使って基底クラス(Base)にキャストした場合と、as演算子を使って基底クラス(Base)にキャストした場合では、メソッドの実行結果が異なります。is演算子でのキャストでは、Derivedクラスのメソッドが呼び出されますが、as演算子でのキャストでは、Baseクラスのメソッドが呼び出されます。

6行目がis演算子でキャストした結果、8行目がas演算子でキャストした結果。