C#显式派生派生类型

时间:2010-01-29 19:24:06

标签: c# class inheritance casting

如果我创建了A类,并且B类继承自A类,为什么C#要求我在它们之间显式转换?

例如:

public class Mammal
{
}

public class Dog : Mammal
{
}

...

Mammal foo = new Dog(); // Invalid, wants an explicit cast
Mammal bar = (Mammal)new Dog(); // This one works

我只是好奇这种限制背后的原因是什么。

2 个答案:

答案 0 :(得分:6)

不太清楚你的意思?你编写的这两个语句都可以编译并正常工作。

你的意思是把它写成你的问题......?

Dog foo = new Mammal(); // Invalid, wants an explicit cast
Dog bar = (Dog)new Mammal(); // This one works

如果这就是你的意思(它会与注释相匹配)那么第一个就不会编译,因为Mammal不是Dog并且编译器知道它,所以它不会让你赋予它(DogMammal,因为它是从它派生的,但反过来却不成立)。在第二个中,你将覆盖编译器更好的判断,告诉它你更清楚Mammal确实是Dog,但事实并非如此,这个语句在运行时会失败InvalidCastException

答案 1 :(得分:2)

他们都工作。