【问题标题】:InvalidCastException when casting from base class to inherited class?从基类转换为继承类时出现 InvalidCastException?
【发布时间】:2011-11-15 15:08:43
【问题描述】:
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 是否有原因?

(呸,当我写这篇文章时,答案突然出现在我的脑海中,一清二楚。张贴给后代,只是为了确保我做对了。)

【问题讨论】:

    标签: c# .net inheritance casting


    【解决方案1】:

    你在问这个:

    class Animal { }
    class Cat : Animal { }
    class ShortHairedCat : Cat { }
    
    ShortHairedCat shortHairedCat = (ShortHairedCat)new Cat();
    

    Cat 是 ShortHairedCat 吗?不必要。在这种特殊情况下,new Cat() 是 Cat 而不是 ShortHairedCut 所以你当然会遇到运行时异常。

    记住,继承模型是一种关系。 Base 不一定是 Derived,所以一般来说,“向下转换”是危险的。

    【讨论】:

    • 是的,我在打字的时候就知道了。非常感谢。 :)
    【解决方案2】:

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

    【讨论】:

    • 是的,在我发布问题时想通了。现在感觉好傻。哦,好吧,至少如果其他人签订了“teh st00pid”的临时案例,他们可以参考这个。 :)
    【解决方案3】:

    您将对象实例化为StoreCategory。和XMLStoreCategory不一样,不能这样投。

    演员表起作用的情况是这样的:

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

    这会起作用,但在您的特定情况下有点没用。只需实例化 XMLStoreCategory 就可以了。

    【讨论】:

      猜你喜欢
      • 2011-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-10
      • 2020-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多