2014-09-05 135 views
3
internal class B { } 
internal class D : B { } 

    class Program { 

    static void Main(string[] args) { 

    B dToB = new D();//will execute successfully. - line 1 
    D bToD = (D) new B(); //will fail at runtime. - line 2 

    } 
} 

我不明白爲什麼從基類型實例到派生類型引用的轉換/轉換不被視爲類型安全?爲什麼它不是類型安全的將基類型實例轉換爲派生類型對象/參考

從技術上講,對象D包含了B的所有特性,所以它應該能夠作爲其基本實例的引用。不應該有其他的例外嗎?像第1行應該失敗,但不是第2行。

僅當我們試圖從類型轉換/轉換爲完全不同類型時,類型安全是否會出現?而在基類型實例派生類型引用的情況下是不允許的,而另一種方式是因爲設計而被允許的?

謝謝!

卡菲基恩

+2

因爲B不是D,所以不能將'new B()'強制轉換爲'D'。D是B。 – 2014-09-05 18:38:37

+2

每一隻'狗'都是'動物',但不是每一隻'動物'都是'狗' – user2711965 2014-09-05 18:39:01

回答

3

您可以將new DB因爲D擁有一切B呢,再加上一些額外的東西。因此,將它看作B是安全的。

走另一條路,一個new B沒有一切D了,所以如果你執行D特定功能,或訪問一個D特定屬性/成員,那就壯觀失敗。

因此,此作業/轉換不安全或無效。

+1

非常感謝!我錯過了底層類型的運行時類型是B但是引用是D的事實,當我們試圖在B的實例上訪問D的成員時,它會失敗。 – Karthik 2014-09-05 19:10:09

相關問題