我有作为动物的基础班和作为狗的儿童班
这是代码:
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);