コード例 #1
0
    public static int Main()
    {
        Derived1 d1 = new Derived1();
        Derived1 x  = d1.Method();

        Console.WriteLine(x.GetType());     // outputs Derived1
        Derived2 d2 = new Derived2();
        Derived2 y  = d2.Method();

        Console.WriteLine(y.GetType());     // outputs Derived2
    }
コード例 #2
0
        static void Main(string[] args)
        {
            Derived1 dynamicD1;
            Derived2 dynamicD2;
            Base     dynamicB1;
            Base     dynamicB2;

            // 通常アップキャスト
            dynamicB1 = new Derived1();
            dynamicB2 = new Derived2();
            // 通常ダウンキャスト
            dynamicD1 = (Derived1)dynamicB1;
            dynamicD2 = (Derived2)dynamicB2;


            #region パターン_エラー
#if ERROR
            // テレコしたダウンキャスト
            dynamicD1 = (Derived1)dynamicB2;
            dynamicD2 = (Derived2)dynamicB1;
#endif
            #endregion


            /* is */
            Derived1 varD1 = new Derived1();
            // 通常インスタンスは当然trueとなる
            Console.WriteLine(varD1 is Derived1);
            // アップキャストされた変数は元の型には戻せる
            Console.WriteLine(dynamicB1 is Derived1);
            // アップキャストされた変数は別の型には戻せない
            Console.WriteLine(dynamicB2 is Derived1);
            // キャスト可能か判断
            if (dynamicB1 is Derived1)
            {
                // ダウンキャスト前は基底クラスのメンバしか使用できない
                Console.WriteLine(dynamicB1.var01);

                // 可能な場合はダウンキャスト
                dynamicD1 = (Derived1)dynamicB1;

                // ダウンキャスト後は元のクラスのメンバも使用できる
                Console.WriteLine(dynamicD1.var02);
            }

            // キャスト可能かどうかを判断するため
            // 厳密に同じ型かどうかは判断できない
            Console.WriteLine(dynamicB1 is Derived1);
            Console.WriteLine(dynamicB1 is Base);
            // 厳密に判断したい場合は以下のようにする
            Console.WriteLine(dynamicB1.GetType() == typeof(Derived1));
            Console.WriteLine(dynamicB1.GetType() == typeof(Base));


            /* as */
            // キャストできないためnullを格納する
            Derived1 varD2 = dynamicB2 as Derived1;
            Console.WriteLine(varD2 == null);
            // キャストできる
            varD1 = dynamicB1 as Derived1;
            Console.WriteLine(varD1.var02);
            // isで書き換えると以下となる
            Derived1 varD1_1 = dynamicB1 is Derived1 ? (Derived1)dynamicB1 : null;


            Console.ReadKey();
        }