为什么要将基类分配给派生类需要显式转换?但不要求做相反的事情

pau*_*sim 8 c# types derived base variable-assignment

我有一个基类和一个派生类,如下所示

public class animal
{
    public string name { get; set; }
}

public class dog : animal
{
    public int age { get; set; }
    public string type { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

用途:

animal a = new animal();

dog d = new dog();

a = d; //compiled

d = a; //Error:Cannot implicitly convert type 'animal' to 'dog'.

d = (dog)a; // compiled
Run Code Online (Sandbox Code Playgroud)

内部派生类可以分配给base但是需要进行反向显式转换?即使base和derived类都包含相同的成员,也会发现相同的结果.

Mar*_*ill 9

所有的狗都是动物,但不是所有的动物都是狗.不允许进行隐式转换,因为您的a实际上可能不是d.


Jim*_*elo 6

当您使用显式转换时,在您的情况下,您告诉编译器您知道发生了什么.如果您要编译代码,删除d = a;,并且您尝试访问公共成员d,则会抛出异常.那是因为,在这种情况下,animal不是a dog.您明确创建了一个animal并将其分配给a.

显式转换允许您在知道转换有效时执行操作.

public class MyClass
{
    public animal MyAnimal { get; private set; }

    public MyClass ()
    {
        MyAnimal = new dog ();
    }

    public void SetAge (int Age)
    {
        ((dog)MyAnimal).age = Age;
    }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我们知道MyAnimal实际上是a dog,所以我们可以对它进行显式转换.所有这一切都因为继承而起作用.因为继承不能同时工作,所以编译器不允许隐式向上转换 - 您必须明确地执行它.

我们知道当一个类继承自它的基类时,它需要公共属性和方法.你不能说你对a的引用animal总是包含a的属性和方法dog.