我得到了下面的代碼:裝箱和拆箱,爲什麼輸出都不是「System.Object」?
object var3 = 3;
Console.WriteLine(var3.GetType().ToString());
Console.WriteLine(typeof(object).ToString());
輸出是:
System.Int32
System.Object
他們爲什麼不都System.Object
?
我得到了下面的代碼:裝箱和拆箱,爲什麼輸出都不是「System.Object」?
object var3 = 3;
Console.WriteLine(var3.GetType().ToString());
Console.WriteLine(typeof(object).ToString());
輸出是:
System.Int32
System.Object
他們爲什麼不都System.Object
?
如果你問爲什麼boxedObject.GetType()不返回對象.. 檢查出的部分'拳擊轉換'在MSDN Boxing and Unboxing page下的圖像。好問題btw ..至少我理解你的問題。
雖然我可能不是技術上是正確的,它看起來像
忽略拳擊的話題,所有的類都從類型對象繼承。對於參考類型和值類型都是如此。 GetType顯示最派生的類型,在這種情況下是System.Int32。
其中幾次的GetType是否會返回一個System.Object的是,如果你這樣做:
object var = new Object();
Console.WriteLine(var.GetType().ToString());
拳擊是指當值類型是引用類型被指。通常這是作爲System.Object引用完成的。 TypeOf將返回最爲派生的實際類型,而不是參考類型。
class A
{
}
class B : A
{
}
class C : B
{
}
object obj1 = new ClassA();
ClassB obj2 = new ClassB();
ClassB obj3 = new ClassC();
GetType將爲這些類型做類似的事情。
System.Console.WriteLine(obj1.GetType().ToString());
System.Console.WriteLine(obj2.GetType().ToString());
System.Console.WriteLine(obj3.GetType().ToString());
ClassA的
ClassB的
ClassC
值類型並不真正從Object派生。它們完全在類型層次結構之外。然而,對於每個值類型,都有一個類型類型,它來自具有諷刺名稱的ValueType(儘管它的名稱是類類型)。系統在每個值類型及其相應的自動生成的類類型之間定義隱式雙向轉換運算符。從值類型到類類型的隱式轉換稱爲「裝箱」;反向轉換是「拆箱」。 – supercat 2011-09-13 06:52:16
@supercat:隨意編輯答案,如果你想:) – 2011-09-13 07:20:55
這是不是真正的拳擊;這是關於GetType
的行爲。它返回變量的值的的類型,而不是變量是類型聲明有:
object var4 = new List<string>();
Console.WriteLine(var4.GetType().ToString());
將不會返回System.Object
無論是。
它將返回實例的類型,而不是參考的類型 – 2010-08-10 09:01:14
變量的聲明只是編譯時的信息,而方法的執行是運行時。換句話說,GetType()無法知道對象的聲明類型,因爲它只能在運行時知道對象的實際類型。
類似的,如果你有
class a
{
}
class b : a
a bInstance = new b();
bInstance.GetType();
調用bInstance.GetType()不知道該變量被宣佈爲「A」型的方式,我不認爲你希望它返回「一個'在這種情況下。然而在上面的例子中,a是我對象的縮寫,而b是System.Int32
@Also OP,Console.WriteLines都可以工作,即使沒有顯式的ToString() - 如果你的參數會被隱式調用類型是一個對象。 – Gishu 2010-08-10 09:23:06
刪除了稱呼:「提前致謝」,也刪除了標題中的非法單詞:「關於」的問題,下次不要這樣做 – 2015-05-18 18:57:37