2011-09-12 9 views
1
public abstract class ContentManagedEntity 
{ 
    public Guid Guid { get; set; } 

    public bool Active; 

    public int DisplayOrder; 
} 

public class StoreCategory : ContentManagedEntity 
{ 
    public string Name { get; set; } 
} 

public class XMLStoreCategory : StoreCategory, IXMLDataEntity 
{ 
    public bool Dirty = false; 
} 

void main() { 
    var storecategory = new StoreCategory { Name = "Discount Stores" }; 
    var xmlstorecategory = (XMLStoreCategory) storecategory; // Throws InvalidCastException 
} 

実行時に最後の行にInvalidCastExceptionがスローされる理由はありますか? 基本クラスから継承クラスにキャストするときにInvalidCastExceptionが発生しますか?

は(私がこれを書いたようフンは、その答えは、私の頭の中に毎日のように明確に現れた。後世のためにそれを投稿し、ちょうど私が右のそれを持っていることを確認する。)すべて XMLStoreCategoryオブジェクトは StoreCategory sは

答えて

3

すべてがXMLStoreCategoryであるとは限りません。この場合、StoreCategoryを作成し、それをそれ以外のものにキャストしようとしています。あなたはこのことを求めている

+0

うん、質問を投稿していたときにそれを理解しました。今はかなり馬鹿だと感じる。まあ、少なくとも、他の誰かが "teh st00pid"の一時的な契約を締結している場合、彼らはこれを参照することができます。 :) –

4

class Animal { } 
class Cat : Animal { } 
class ShortHairedCat : Cat { } 

ShortHairedCat shortHairedCat = (ShortHairedCat)new Cat(); 

CatShortHairedCatですか?必ずしも。この特定のケースでは、new Cat()Catで、ShortHairedCutではありません。したがって、実行時例外が発生します。

継承モデルは、の関係です。 Baseは必ずしもDerivedであるとは限りません。したがって、一般に「ダウンキャスト」は危険です。

+0

ええ、私は物事を入力していたように私はそれを考え出した。本当にありがとう。 :) –

2

オブジェクトをStoreCategoryとしてインスタンス化しました。 XMLStoreCategoryと同じではありません。そのようにキャストすることはできません。キャストが働くだろう

場合は、次のようなものです:

StoreCategory storecategory = new XMLStoreCategory { Name = "Discount Stores" }; 
var xmlstorecategory = (XMLStoreCategory) storecategory; 

動作しますが、あなたの特定のケースで多少無用です。ちょうどXMLStoreCategoryをインスタンス化すると、あなたは良いことになるでしょう。

関連する問題