2015-06-02 41 views
0

考慮兩個簡單的類爲什麼在c#中可以直接進行向上轉換,但爲了向下轉換,我們需要expilicit轉換?

public class Parent 
{ 
    public void ShowData() 
    { 

    } 
} 

public class Child : Parent 
{ 
    public void GetData() 
    { 

    } 
} 

// Upcasting -- NO ERROR 
Parent objParent = new Child(); 

// Downcasting -- ERROR 
Child objChild = new Parent(); 

// Downcasting -- NO ERROR 
Child objNewChild = (Child)new Parent(); 
  1. 爲什麼UpCasting不需要explicit casting
  2. 爲什麼DownCasting要求explicit casting
+0

因爲它應該如何猜測你想要投射哪個孩子?(因爲你可以有多個孩子) – musefan

+2

@musefan:由於它試圖分配的變量的類型?這*可能*是一個隱式轉換,但它不是... –

回答

6

爲什麼UpCasting不需要顯式轉換?

因爲它總是安全的。它永遠不會拋出異常。

爲什麼DownCasting需要顯式投射?

因爲它的不是安全。它可以拋出異常或丟失信息(例如在未經檢查的情況下從long轉換爲int)。

編譯器的高興,讓你做安全隱含的東西,但如果你要做些什麼「危險」,需要有效勾選框說:「我知道我在做什麼在這裏。」

從C#規範,第6.1節:

預定義的隱式轉換總是成功,從不導致異常被拋出。正確設計的用戶定義的隱式轉換也應具有這些特性。

而第6.2:

顯式轉化,但沒有隱式轉換是不能保證總是成功的轉換,已知有可能丟失信息的轉換,不同域之間的轉換類型充分不同,值得明確的符號。


所有隱式轉換也顯式轉換。這只是使技術指標更簡單的技術點。

+0

簡單明瞭。我想我們都使用鑄造和編譯器迫使我們做對了,但事實上,你的方式是整潔,可以很容易理解。非常感謝! –

1

因爲ChildParent,但Parent不一定是Child。因此,如果實際實例是ChildChild的子類,則Parent只能投射到Child。不保證Parent的一些實例或Parent的子類是Child。在你提交new Parent()的情況下,構造超類的一個實例。它會編譯,但你會得到一個運行時異常。

+0

非常好的一點,編譯的最後一個例子在運行時保證會拋出。 – phoog