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 }
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(); }