2013-07-30 48 views
1

我知道已經有一些相關的問題發佈了,但是我看到了不同的答案,所以我很困惑哪個答案是正確的。這真的是向下傾斜嗎?它對我來說工作正常

在下面的鏈接,人們提到,向下轉換是不可能的 Convert/Cast base type to Derived type

儘管下面這個鏈接,人們提到,向下轉換是可能的,只有派生類是基類的一個實例 downcast and upcast

我做了一個小實驗,並使用直接投射在迷你項目(C#)上實現了向下轉換,例如:DerivedClass dc =(DerivedClass)baseClass,而不檢查DerivedClass是否是BaseClass的實例,令我吃驚的是,它工作正常,沒有錯誤,所以人們說向下轉換是不可能的?

所以我的問題是,真倒黴是不可能的?爲什麼人們對這個話題似乎有不同的答案?畢竟哪一個纔是真正的答案?有人可以更詳細地解釋這一點嗎?

示例代碼:

public class Order { } 

public class PurchaseOrder : Order { // some new properties here for PurchaseOrder} 

public static PurchaseOrder GetOrder() 
{ 
    Order order = new Order(); 
    return (PurchaseOrder)order; 
} 
+0

發佈您的測試代碼。 –

+1

您在更新***中發佈的代碼沒有錯誤地編譯***,但當* run *將失敗且出現'InvalidCastException'。 –

+0

我已經使用上面的代碼很長一段時間了,而且我還沒有看到任何錯誤。很奇怪...... –

回答

4

向下轉換是可能的,如果你確定你的類型,這工作得很好:

class Base {} 
class Derived : Base {} 

Base b = new Derived(); 
Derived d = (Derived) b; 

這不起作用:

class Other : Base {} 

Base b = new Other(); 
Derived d = (Derived) b; // InvalidCastException 
+0

你的代碼甚至不需要演員。 b已經是派生類型,所以這根本沒有意義。 –

+0

BTW:此代碼不反映原始問題中顯示的代碼! –

+0

對不起,這是錯字,這裏是正確的代碼:class Base {} class Derived:Base {} Base b = new Base();派生d =(派生)b; –

8

向下轉換ISN不可能當對象不是實際上是的一個實例你正試圖轉換的類型 - 如果它只是基類的一個實例。

可能當它是一個派生類的實例已經。

例如,這是好的:

object x = "hello"; 
string y = (string) x; 

這裏x值到的string實例的引用,所以向下轉換到string被罰款。

這是不

object x = new object(); 
string y = (string) x; // Bang! 

這裏x值到的object實例的引用,因此轉換失敗。

編輯:現在你已經包含在問題的代碼是像我例子 - 你要創建的只是Order一個實例,並試圖將其轉換爲PurchaseOrder。這將無法正常工作 - 它不是 a PurchaseOrder。但是,如果你這樣改變它:

public static PurchaseOrder GetOrder() 
{ 
    Order order = new PurchaseOrder(); 
    return (PurchaseOrder)order; 
} 

......這很好。 (這是奇怪的代碼,但它的工作原理。)

請參閱MSDN中的"Casting and type conversions"瞭解更多信息。


或者,如果你想轉換爲對象的實際的層次中的其它接口或類。例如,這也可以:

object x = new MemoryStream(); 
Stream y = (Stream) x; // Stream is in the type hierarchy of MemoryStream 
+2

Hihi,即使你在Jon之前發佈,你也沒有得到任何+1的:) –

+0

我可以問爲什麼我的編輯被拒絕而贊成你自己編輯的大致相同嗎? :| –

+0

@ D.R .:由於它不適合你進行編輯 - 增加更多材料而不是僅僅磨礪現有材料 - 而原作者可以做到這一點。 –

相關問題