直列つなぎ。 -とある発達障害者の記録

知識と知識を繋ぐためのblog。 広汎性発達と診断されました。ぜんぜん役に立ってないけど。月収13万円、家賃4万円で生活するひつじ人間。

C# アップキャストとダウンキャスト as演算子


多態性
 http://ufcpp.net/study/csharp/oo_polymorphism.html
  より




Class Base{} class Derived1 : Base{} class Derived2 : Base{} class DowncastTest { static void Main() { Derived1 d1 = new Derived1(); // 当然、合法。 Derived2 d2 = new Derived2(); // 同じく、合法。 Base b; Derived1 d; b = d1; //派生(derived)クラス<Down>基底(base)クラス<Up>に格納
   d = (Derived1)b; // 基底クラス(Up)派生クラス(down)へ格納  → ダウンキャスト

// Derived1 の変数に Derived1 のインスタンスを格納しているので、これはOK。
b = d2; // 派生クラス2<Down>を基底クラス(deeives1のインスタンス)<Up>に格納 d = (Derived1)b; //エラー                 // Derived2<Down> のインスタンスを
Derived1 の変数<Down>に
格納しているので、
                   //これは問題あり。つまりダウンキャストになっていない。
 

// コンパイルは通るが、実行時エラーになる。
 //型 'Derived2' のオブジェクトを型 'Derived1' にキャストできません。
  
} }



分かり易くするための涙ぐましい努力である。こういうときはアナログなNoteより管理が楽。



自分で書き換えた方が飲みこみ易い

 
using System;



class Base { }
class Derived1 : Base { }
class Derived2 : Base { }



class Program
{
static void Main()
{
Derived1 d1 = new Derived1(); // 当然、合法。
Derived2 d2 = new Derived2(); // 同じく、合法。

Base b;
Derived1 d;

b = d1; // アップキャストは常に合法。明示的なキャスト不要。
d = (Derived1)b; // ダウンキャストは明示的なキャストが必要。

if (b is Derived1)
{

Console.Write(d.GetType()+"\n");
} // Derived1 の変数に Derived1 のインスタンスを格納しているので、これはOK。

b = d2;

if (b is Derived1)
{
d = (Derived1)b;

// Derived1 の変数に Derived2 のインスタンスを格納しているので、これは問題あり。
// コンパイルは通るが、実行時エラーになる


Console.Write(d.GetType());

}


else
Console.Write("キャスト出来ません"+"\n");

}
}






 as演算子



        d = b as Derived1;
        //d = (Derived1)b;  ←書き換え
 
        
        if (d != null)
        {
        
            Console.Write(d.GetType()+"\n");
        }                   // Derived1 の変数に Derived1 のインスタンスを格納しているので、これはOK。

        b = d2 as Derived2;


       d = b as Derived1;
        //d = (Derived1)b;  ←書き換え



        if (d != null)
        {
            // Derived1 の変数に Derived2 のインスタンスを格納しているので、これは問題あり。
            // コンパイルは通るが、実行時エラーになる


            Console.Write(d.GetType());

        }


        else
            Console.Write("キャスト出来ません"+"\n");

    }
    }


is演算子の拡張 
 C#のversionが違うのか出来なかった。

 
asでもいいのだが、isの方が直感的で好み。
asはNullのみ、isはtrue or false.


関連記事
スポンサーサイト

 C#

0 Comments

Leave a comment