我有作为动物的基础班和作为狗的儿童班

这是代码:

class Animal
{
    public int Legs { get; set; }

    public string Name  { get; set; }
}

class Dog : Animal
{
    public int noOfTail { get; set; }
}


在下面执行我的主要方法时,出现异常:

   static void Main(string[] args)
    {
        Animal a = new Animal();
        Dog d = new Dog();
        d = (Dog)a;
    }


但是当我第一次将派生类转换为父类时,我没有任何异常,这就是为什么我感到困惑,有人可以解释其背后的原因。

   static void Main(string[] args)
    {
        Animal a = new Animal();
        Dog d = new Dog();
        a = d;
        d = (Dog)a;
    }

最佳答案

在第二种情况下,您有一只狗和动物的实例

Animal a = new Animal();
Dog d = new Dog();


那么你有reference copy狗对动物

a = d;


因此,a是指向d的,而d是狗实例,并且像noOfTail这样的实例属性仍然存在,但是被隐藏并且在对象a中不可用。
然后你有这条线:

d = (Dog)a;


在最后一行中,您具有d的引用副本到a,因此d指向a指向的位置,所以一切正常。

但是如果您想将一只Instance of child class狗复制到Animal的一个实例,则子类的属性将丢失。您需要与Compiler确认并对他说,您知道像noOfTail这样的实例属性将不再可用
您的代码最像这样:

 Animal a = new Animal();
 Dog d = new Dog();
 d = (a as Dog);

08-25 01:42