2014-09-20 127 views
0

這當然很簡單,但是在一段時間裏讓我煩惱,所以希望在這裏得到一些詳細的解釋。我知道,當你做爲什麼GetType()在顯式地將派生類派生到基類後返回派生類?

BaseClass b = new DeriveClass(); 

b的類型仍然是BaseClassDeriveClass,因爲從派生類的基類隱式轉換的。事實上,這也是合法的做

BassClass b = (BaseClass)new DeriveClass(); 

但編譯器不需要這樣做。無論如何,我不明白的是,在我試圖撥打b.GetType()後,它會返回DriveClass而不是BaseClass
這是爲什麼?

+2

http://stackoverflow.com/questions/5780584/will-gettype-return-the-most-derived-type-when-called-from-the -base-class – 2014-09-20 20:06:15

+1

施放一個對象不會修改對象,它仍然是同一個對象。鑄造只是說你想以某種方式引用該對象,並驗證該對象確實可以用這種方式引用。 – RenniePet 2014-09-20 20:07:09

+0

您應該確保您瞭解對象引用和對象之間的區別。 – usr 2014-09-20 20:14:01

回答

1

GetType()始終返回實例的當前類型(在運行時檢查,而不是編譯時)。它寫在msdn上:

獲取當前實例的類型。在MSDN

代碼示例:

MyBaseClass myBase = new MyBaseClass(); 
MyDerivedClass myDerived = new MyDerivedClass(); 
object o = myDerived; 
MyBaseClass b = myDerived; 

Console.WriteLine("mybase: Type is {0}", myBase.GetType()); 
Console.WriteLine("myDerived: Type is {0}", myDerived.GetType()); 
Console.WriteLine("object o = myDerived: Type is {0}", o.GetType()); 
Console.WriteLine("MyBaseClass b = myDerived: Type is {0}", b.GetType()); 

// The example displays the following output: 
// mybase: Type is MyBaseClass 
// myDerived: Type is MyDerivedClass 
// object o = myDerived: Type is MyDerivedClass 
// MyBaseClass b = myDerived: Type is MyDerivedClass