型変換


class ClassTest2
   {
       class BaseClass
       {
           public int baseNum { get; set; }
       }
       class MyClass :BaseClass
       {
           public string Name { get; set; }
       }
       class MyClass2 :BaseClass
       {
           public int ID { get; set; }
       }

       public ClassTest2()
       {
           int num1 = 12;
           double num2 = 3.5125;

           num2 += num1;       //暗黙的な型変換。double型にint型の値を演算する場合はデータの損失が無いので特別な構文は必要ない
           num1 += (int)num2;  //明示的な型変換(キャスト)変換時に情報が失われる可能性があるときは変換を明示する必要がある

           MyClass myClass = new MyClass();
           myClass.baseNum = 12;
           myClass.Name = "TARO";
           BaseClass baseClass = myClass;    //暗黙的な型変換。派生クラスは基本クラスのメンバーが含まれている為、特別な構文は必要ない

           Console.WriteLine(baseClass.baseNum);

           baseClass.baseNum = 24;
           myClass = (MyClass)baseClass;     //逆は変換時に情報が失われる可能性があるので明示的にキャストが必要となる
           Console.WriteLine(myClass.baseNum +" : "+ myClass.Name);

           //MyClass2 ex = (MyClass2)myClass;    //同じ基本クラスを持っていても別の型なので明示的型変換は不可能

           TestMethod(myClass);    //myClassをBaseClassとして渡しているが・・・呼び出した関数内でエラーが出る
       }

       static void TestMethod(BaseClass a)
       {
           MyClass2 r = (MyClass2)a;
           //もし引数がMyClass型である場合、同じ基本クラスを持っていても型としては別のもの(互換性は無い)なので
           //明示的型変換は不可能となる。これは実行時、初めて現れるエラーになる
           //CLRは変換元を記憶していて互換性を判断している
       }
   }
最終更新:2012年05月29日 16:16