2013-07-28 121 views
0

在下面的代碼中,我將子類投射到基類中,但get類型顯示它仍然是子類的實例。這裏發生了什麼?將子類投射到基類後,類型仍然是子類

using System; 

namespace ConsoleApplication 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Car c1 = new Car { m = "M", c = "C" }; 

      Machine m1 = (Machine)c1; 

      Console.WriteLine(m1.GetType());//ConsoleApplication.Car 

     } 
    } 

    public class Machine 
    { 
     public string m; 
    } 

    public class Car : Machine 
    { 
     public string c; 
    } 


} 
+0

如果基類是'abstract'會怎麼樣?那麼有一個基類的實例呢? –

+0

@retailcoder確實,或者如果你將它鑄造到'interface'! – Blorgbeard

回答

4

這是因爲物體本身的子類的實例。你只是用基類引用指向它。

1
m1.GetType() 

這沒有看變量的聲明類型,它在對象本身上運行GetType()函數。而對象本身知道它是什麼類型,而不管你爲什麼特定的變量進行轉換。

4

鑄造不會更改實例的類型。投射改變參考的類型。

轉換更改實例的類型。

+0

如何將汽車實例轉換爲機器實例? – Foo

+0

在返回機器的Car上實現一個方法。在該方法中,新建一個Machine實例並返回它。機器myMachine = myCar.ToMachine(); –