2010-01-29 80 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

他們都工作。