2010-01-29 58 views
1

如果我创建类A,并且类B继承自类A,为什么C#要求我在它们之间明确转换?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 

我只是好奇的理由是,限制落后的东西。

+4

显式转换不应该被要求,当我测试你的代码时,第一个版本工作得很好。你能发布更完整的样本吗? – itowlson 2010-01-29 19:27:28

+2

我不知道谁会投这个问题,当它暗示上演不能自动工作。 – Blindy 2010-01-29 19:28:43

+1

Downvoted,因为这段代码实际上起作用 – 2010-01-29 19:31:12

回答

6

不太确定你的意思?你编写的两个语句都能编译并且工作正常。

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

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

如果这是你的意思(这将匹配的评论),那么第一个将不能编译,因为一个Mammal不是Dog和编译器知道它,所以它不会让你为它分配( DogMammal,因为它是从它派生的,但反过来不成立)。在第二个中,你重写了编译器的更好的判断,并告诉它你更清楚Mammal确实是Dog,但事实并非如此,该语句在运行时将失败,并且出现InvalidCastException

+0

而这将是一个方差问题。 http://blogs.msdn.com/ericlippert/archive/tags/Covariance%20and%20Contravariance/default.aspx – 2010-01-29 19:31:17

+0

这不是一个方差问题。 – itowlson 2010-01-29 19:39:57

+0

我确信我以前曾观察过这种情况,但是是的,看起来我的测试代码中有类倒退 – 2010-01-29 19:45:47

2

他们都工作。