[英]Assigning instance of a derived class to a variable of base class
您好,我是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。 无法将类型“动物”隐式转换为“猴子”。 一个明确的
转换存在(您是否缺少演员表?)
我不明白-如果最后一行代码抛出错误CS0266,为什么GetType方法返回“ a”变量的类型为“ Monkey”。 如果“ a”变量是Animal,如何找到它? 用什么方法?
GetType()
在运行时评估。 您得到的错误是在编译时,即程序运行之前。
编译器需要使用编译时拥有的信息来确保类型安全。 确保意味着确保不会出错 。 通常,将Animal
分配给Monkey
是不安全的,因为Tiger
也是动物,因此从理论上讲,您最终可以将老虎分配给猴子类型的变量。
您可以告诉编译器,尽管分配不安全,但是您知道自己在做什么。 您可以通过显式强制转换来做到这一点:
Monkey m2 = (Monkey)a;
在这里,您要告诉编译器; “嘿,我知道这通常并不安全,但是请相信我,我知道 a
是一只Monkey
”。
编译器将接受您的承诺,但不会完全信任您,因此将在运行时执行类型检查以确保确定,并且如果您的承诺是谎言,则将收到运行时错误。
变量的类型为Animal
,编译器将不允许您将其分配给Monkey
因为Animal
不一定是Monkey
。 您可以指定其他方式,因为Monkey
总是 Animal
。 GetType()
返回该变量所指向的对象的运行时类型 ,编译器不知道该对象,也不知道任何相关信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.