将派生类的实例分配给基类的变量

时间:2017-12-08 10:40:08

标签: c# .net

您好我是C#的新手,我正试图找出“隐式转换”操作。我有一个问题:

    class Animal { }
    class Monkey : Animal { }

    Monkey m = new Monkey();
    Animal a = m; 
    m.GetType()
    [Submission#165+Monkey]
    a.GetType()
    [Submission#165+Monkey]
  

Monkey m2 = a; //此调用 - 编译器错误CS0266。   无法隐式将“Animal”类型转换为“Monkey”。一个明确的

     存在

转换(您是否错过了演员?)

我不明白 - 如果最后一行代码行抛出错误CS0266,为什么GetType方法返回“a”变量的类型为“Monkey”。如果“a”变量是Animal如何找到它?用什么方法?

2 个答案:

答案 0 :(得分:2)

GetType()在运行时进行评估。您得到的错误是编译时间,这是在程序运行之前。

编译器需要使用编译时的信息来确保类型安全。确保意味着确保什么都不会出错。通常,将Animal分配给Monkey并不安全,因为Tiger也是动物,所以理论上你最终可以将老虎分配给猴子类型的变量。 / p>

您可以告诉编译器虽然分配不安全,但您知道自己在做什么。您可以使用显式强制转换来执行此操作:

Monkey m2 = (Monkey)a;

这里你告诉编译器; "嘿,我知道这通常不安全,但相信我,我知道 aMonkey"。

编译器将接受您的承诺,但不会完全信任您,因此将在运行时执行类型检查以确保,如果您的承诺是谎言,您将收到运行时错误

答案 1 :(得分:1)

变量的类型为Animal,编译器不允许您将其分配给Monkey,因为Animal不一定是Monkey。您可以指定相反的方式,因为Monkey 总是 AnimalGetType()返回变量指向的对象的运行时类型,编译器没有,也不知道任何有关的内容。