- アップキャストは、常に安全に行える
- ダウンキャストは、エラーが発生する事がある。
※ 解説 ※
- キャストは型を変更するだけで、中身が消える訳ではない。
(アクセスできる範囲が変わるだけで、実態は存在している) - インスタンス作成時、メモリに領域が割り当てられる。
- 子クラスのインスタンスは、親クラスのインスタンスより多くの領域を必用とする。
- 親→子 とキャストした場合、子クラスが必要とする領域に、メモリが割り当てられていない状態となる。
(そのため、エラーとして弾いている。)
以上を踏まえて、サンプルソースで説明。
//親クラス class ParentClass { } //子クラス class ChildClass : ParentClass { } private void MyButton01_Click() { //=========================== // アップキャスト //=========================== ParentClass parent01; ChildClass child01; //子クラスのインスタンスを生成 child01 = new ChildClass(); //子クラスのインスタンスを、親クラスに代入可能。 parent01 = child01; //=========================== // ダウンキャスト(エラー) //=========================== ParentClass parent02; ChildClass child02; //親クラスのインスタンスを生成 parent02 = new ParentClass(); //キャストできるかどうか確認(falseになります) if (parent02 is ChildClass) { //キャスト時にエラーが発生する child02 = (ChildClass)parent02; } //asを使えば キャストできない場合 nullが入る child02 = parent02 as ChildClass; //=========================== // ダウンキャスト //=========================== ParentClass parent03; ChildClass child03; //親クラスのインスタンスを、子クラスで生成 parent03 = new ChildClass(); //ダウンキャスト可。 child03 = (ChildClass)parent03; }