< ボクシング | デリゲートの非同期呼び出し >

July 18, 2008

as

互換性のない型にキャストしようとすると実行時に例外が発生します。このとき、as 演算子を使用すると例外を発生させる代わりに null を返すようにすることができます。as 演算子は、変換先のデータ型が null を許容する型(つまり参照型)に限って使用できます。
// 動物クラス
class Animal
{
    protected string sName;
    public Animal () { sName = "unnamed"; }
    public string Name
    {
        get { return sName; }
        set { sName = value; }
    }
}

// 犬クラス
class Dog : Animal { }

// 猫クラス
class Cat : Animal
{
    static void Main ()
    {
        object obj = new Cat ();

        Animal animal = obj as Animal;  // obj は動物かな?
        if (animal == null)
            System.Console.WriteLine ("obj isn't animal.");
        else
        {
            System.Console.WriteLine (animal.Name);
        }

        Cat cat = obj as Cat;           // obj は猫かな?
        if (cat == null)
            System.Console.WriteLine ("obj isn't cat.");
        else
        {
            cat.Name = "Kajino";        // 名前をつけよう!
            System.Console.WriteLine (cat.Name);
            if (animal != null)
                System.Console.WriteLine (animal.Name); // animal も同じ実体を参照している
        }
        
        Dog dog = obj as Dog;           // obj は犬かな?
        if (dog == null)
            System.Console.WriteLine ("obj isn't dog.");
        else
        {
            System.Console.WriteLine (dog.Name);
        }
    }
}
上のコードの実行結果です。
unnamed
Kajino
Kajino
obj isn't dog.

obj は object 型の変数ですが、Cat クラスのオブジェクトへの参照を格納しています。Animal 型、Cat 型へのダウンキャストは成功しますが、Dog 型とは互換性がないため null が返されています。

トラックバック

このエントリーにトラックバック:
http://frog.raindrop.jp/cgi-bin/mt/mt-tb.cgi/2137

コメント

コメントする

※ コメントスパム対策のため、コメント本文はおはよう、こんにちわ、こんばんわのいずれかより始めるようにしてください。

name:
email:

※ 必要ですが、表示しません。

url:
情報を保存する ?