2011-09-12 3 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의이

답변

3

모두가 아니며 StoreCategory은 모두 XMLStoreCategory입니다. 이 경우 StoreCategory을 만들고이를 무언가에 던지려고합니다.

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

ShortHairedCat shortHairedCat = (ShortHairedCat)new Cat(); 

CatShortHairedCat인가 :

+0

그래, 질문을 게시 할 때 알아 냈어. 바로 지금 꽤 바보 같은 느낌. 적어도 오히려 다른 사람이 "st00pid"의 일시적인 계약을 체결하면이 사실을 언급 할 수 있습니다. :) –

4

이 요구하는지? 꼭 그런 것은 아닙니다. 이 특별한 경우에 new Cat()Cat이고 ShortHairedCut이 아니므로 런타임 예외가 발생합니다.

상속 모델 관계입니다. Base이 반드시Derived 일 필요는 없으므로 일반적으로 "다운 캐스팅"은 위험합니다.

+0

그래, 나는 물건을 타이핑 할 때 그것을 알아 냈다. 감사합니다. :) –

2

개체를 StoreCategory으로 인스턴스화했습니다. XMLStoreCategory과 같지 않으므로 그렇게 할 수 없습니다. 캐스트가 작동 할

사례는 다음과 같이이다 :

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

작동하지만 특정 경우에 다소 쓸모가 없다. XMLStoreCategory을 인스턴스화하면 잘 될 것입니다.

관련 문제