![](/img/trans.png)
[英]C# Why does passing of an class instance to a method which accepts object as parameter and boxing it back work
[英]Why calling some functions of the Object class, on a primitive type instance, need boxing?
我發現如果我運行以下代碼行。
int i = 7;
i.GetHashCode(); //where GetHashCode() is the derived
//function from System.Object
沒有裝箱,但是如果我調用i.GetType()
(來自System.Object
另一個派生函數)代替GetHashCode()
,則需要裝箱來調用GetType()
,為什么不能調用GetType()
在原始類型實例上直接,沒有拳擊,而它可以調用GetHashCode()
而不用拳擊?
這里的關鍵是GetType()
不是虛擬的,不能被覆蓋。 由於結構是有效的sealed
,方法不能被重寫比任何結構多 ,所以運行時和編譯器可以處理已經覆蓋靜態調用結構的方法。
如果你編寫一個結構(罕見),你應該覆蓋所有方法,如ToString()
, Equals()
, GetHashCode()
,正是出於這個原因。 如果你不這樣做必須裝箱。 但是, GetType()
無法被覆蓋,因此需要裝箱。
這實際上導致一些奇怪的邊緣情況與Nullable<T>
和裝箱,因為空的Nullable<T>
框為null
,所以:
int i = obj.GetHashCode(); // fine
Type t = obj.GetType(); // boom
我認為原因是GetHashCode直接在System.Int32上實現,你調用System.Int32 :: GetHashCode()。 如果在值類型上調用已知成員函數,則無需使用框。
似乎非常接近ValueType.GetType()如何確定結構的類型 ?
另外相關的是GetType和TypeOf混淆
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.