从基类转换为继承类时出现InvalidCastException?

时间:2011-09-12 19:55:12

标签: c# .net inheritance casting

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?

(呸,正如我写的那样,答案突然出现在我脑海中,明白当天。发布给后人,只是为了确保我做对了。)

3 个答案:

答案 0 :(得分:4)

你问这个:

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

ShortHairedCat shortHairedCat = (ShortHairedCat)new Cat();

CatShortHairedCat吗?不必要。在这种特殊情况下,new Cat()Cat,而不是ShortHairedCut,因此当然会出现运行时异常。

请记住,继承模型关系。 Base 不一定是 Derived,因此一般来说,“向下转发”是危险的。

答案 1 :(得分:3)

所有XMLStoreCategory个对象都是StoreCategory个,但并非所有StoreCategory都是XMLStoreCategory个。在这种情况下,您正在创建一个StoreCategory并尝试将其转换为不属于它的内容。

答案 2 :(得分:2)

您将对象实例化为StoreCategory。它与XMLStoreCategory不同,所以你不能这样投。

演员表可以运作的情况是这样的:

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

这会奏效,但在你的特殊情况下有点无用。只要实例化XMLStoreCategory,你就会好起来。