1: using System;
2:
3: namespace Sample012
4: {
5: public class Class2
6: {
7: public String hello;
8: }
9: class Class1 : Class2
10: {
11: [STAThread]
12: static void Main(string[] args)
13: {
14: Class1 c = new Class1();
15: c.hello = "Hello!";
16: object o = (object)c;
17: Class2 c2 = (Class2)o;
18: Console.WriteLine("{0},{1}",c.hello,c2.hello);
19: }
20: }
21: }
List 7-12
List 7-12のポイントは、Class1のインスタンスとして作ったはずのインスタンスをobjectにキャストしてから、あらためてClass2にキャストしていることである。しかし、9行目を見ると分かるとおり、Class2はClass1のスーパークラスであるため、このキャストは合法である。実際に、helloという変数は、Class2の中だけに存在するものであり、15行目で代入したものと、18行目で参照している変数helloはすべて同一である。
1: using System;
2:
3: namespace Sample013
4: {
5: class Class1
6: {
7: [STAThread]
8: static void Main(string[] args)
9: {
10: int i = 123;
11: object o = i;
12: int j = (int)o;
13: Console.WriteLine("{0},{1},{2}",i,o,j);
14: }
15: }
16: }
List 7-13
これを実行した結果は、Fig.7-13のようになる。
Fig.7-13
List 7-13では、11行目で、あっさりと整数をobject型に代入しているが、ここでボックス化が発生する。ボックス化で情報が欠落することはまったくないので、キャストしなくても問題なく通る。これに対して、12行目でボックス化した値を整数型変数に代入する時点で、ボックス化解除が行われる。この場合には、「(int)」とキャストされていることから分かるとおり、キャストが必要とされている。ボックス化ではキャストはなくてもよいが、ボックス化解除ではキャストを必須とする、と覚えておくとよいだろう。