C# 入門

ホーム > C# の基礎 > as 演算子

as 演算子

ここでは C# の as 演算子について説明します。

as 演算子の存在意義は、オブジェクト指向プログラミングにおける、クラスの継承 (inheritance) というものを理解しておく必要がありますので、 簡単に継承について説明してから、as 演算子について説明したいと思います。

as 演算子とは

まず、ここでクラスをいくつか定義してみましょう。

動物 (Animal) クラスをベースクラスとして、そこから継承して、派生クラスとして犬 (Dog) クラスと猫 (Cat) クラスを定義します。

クラス階層

これを C# で書くと次のようになります。

class Animal {
}

class Dog : Animal {
}

class Cat : Animal {
}

コロン (:) の後に Animal を繋げて Dog クラスと Cat クラスを定義することで、これらが Animal の派生クラスであるということです。

簡単ですね。

つまり、「犬は動物である」「猫は動物である」という is-a 関係というやつです。(まぁ、Animal だと an になるので is-an 関係?(笑))

さて、ではこれらのクラスを使いながら、プログラム上でどのような問題が発生するかみてみましょう。

static void Main( string[] args ) {
	var dog = new Dog();
	var animal = (Animal)dog;
}

ここでは Dog のオブジェクトを new で作成して、dog 変数にセットしています。そして続いてそれを Animal にキャストして、animal 変数にセットしています。

dog は Animal でもありますから、この操作は成功します。

var dog = new Dog();
var animal = (Animal)dog;
var cat = (Cat)animal;

さて、こうして得られた Animal の参照ですが、これを Cat にキャストしたらどうでしょうか。Cat は Dog ではないので、これは失敗します。

このように派生クラスから基底クラスへの型変換はアップキャストといわれます。一方、基底クラスから派生クラスへの型変換はダウンキャストといいます。 C# ではアップキャストは常に安全に成功します。ダウンキャストは上記の例のように失敗する場合があります。

上記を実行すると "Unhandled Exception: System.InvalidCastException: Unable to cast object of type 'Dog' to type 'Cat'." というように InvalidCastException 例外が投げられます。

as 演算子では型がキャストできない場合は、null を返します。

var cat = animal as Cat;

このように as を用いると、animal を Cat に型変換を試み、成功しない場合は戻り値に null が返ります。

従ってダウンキャストの場合は as を用いて型変換をしましょう。

尚、実際に型変換しなくとも is 演算子を用いると型の確認ができます。

var dog = new Dog();
var animal = (Animal)dog;

Console.WriteLine( "animal is Dog: {0}", animal is Dog );
Console.WriteLine( "animal is Cat: {0}", animal is Cat );

この実行結果は次のようになりました。

animal is Dog: True
animal is Cat: False
ホーム > C# の基礎 > as 演算子