您好我是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如何找到它?用什么方法?
答案 0 :(得分:2)
GetType()
在运行时进行评估。您得到的错误是编译时间,这是在程序运行之前。
编译器需要使用编译时的信息来确保类型安全。确保意味着确保什么都不会出错。通常,将Animal
分配给Monkey
并不安全,因为Tiger
也是动物,所以理论上你最终可以将老虎分配给猴子类型的变量。 / p>
您可以告诉编译器虽然分配不安全,但您知道自己在做什么。您可以使用显式强制转换来执行此操作:
Monkey m2 = (Monkey)a;
这里你告诉编译器; "嘿,我知道这通常不安全,但相信我,我知道 a
是Monkey
"。
编译器将接受您的承诺,但不会完全信任您,因此将在运行时执行类型检查以确保,如果您的承诺是谎言,您将收到运行时错误
答案 1 :(得分:1)
变量的类型为Animal
,编译器不允许您将其分配给Monkey
,因为Animal
不一定是Monkey
。您可以指定相反的方式,因为Monkey
总是 Animal
。 GetType()
返回变量指向的对象的运行时类型,编译器没有,也不知道任何有关的内容。