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?
(呸,正如我写的那样,答案突然出现在我脑海中,明白当天。发布给后人,只是为了确保我做对了。)
答案 0 :(得分:4)
你问这个:
class Animal { }
class Cat : Animal { }
class ShortHairedCat : Cat { }
ShortHairedCat shortHairedCat = (ShortHairedCat)new Cat();
Cat
是ShortHairedCat
吗?不必要。在这种特殊情况下,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
,你就会好起来。