アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんにちは。
C#におけるObjectのキャストについて、基本的なことにつまずいてしまいました。

以下のような継承関係にあるクラスで、InvalidCastExceptionが投げられてしまいます。

public class ClassA {}
public class ClassA_Ex : ClassA {}

ClassA_Ex ex = (ClassA_Ex)new ClassA();

キャストできない訳はないと思うのですが…。
何か大きな見落としがありそうですが、よろしくお願いいたします。

A 回答 (2件)

できません。



基本クラスと派生クラス間のキャストで無条件に可能なのはアップキャストのみです。

あなたがやろうとしているのはダウンキャストです。
アップキャストとは違いダウンキャストは常に可能というわけではありません。
次のように基本クラスの変数に代入された派生クラス変数を元の型の変数に戻すような場合しか使えません。
なぜ駄目なのかという理論は#1の回答が参考になります。
    • good
    • 0
この回答へのお礼

コメントありがとうございます。

そうですね。
申し訳ありません。
基本中の基本でした・・・!

なんだか混乱してしまっていました。

お礼日時:2009/08/20 11:46

/* できないよ。

*/

namespace Q5221109A
{
class Program
{
public static void Main(string[] args)
{
Japanese a = new Japanese(); /* 日本人は日本人(当たり前) - OK */
Human b = a; /* 日本人は必ず人間 - OK */
Japanese c = (Japanese)b; /* この人間はたまたま日本人 - OK */

Human d = new Human(); /* dは人間 */
Japanese e = (Japanese)d; /* 人間は必ず日本人であるわけではない。実行時エラー */


}
}

class Human{

}

class Japanese:Human{ /* 「日本人」の集合は「人間」集合の部分集合 */

}
}
    • good
    • 1
この回答へのお礼

コメントありがとうございます。

丁寧にどうもありがとうございました。

できるわけがない、ですね;

お礼日時:2009/08/20 11:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!