[英]How / Why possible a value type derives from a reference type?
在.NET
,所有值類型都繼承自名為System.ValueType的類。 System.ValueType
是一個類,因此它是一個reference type
。
我的問題是value type
如何以及為什么可能從reference type
派生?
以下是文檔中的關鍵段落
盡管ValueType是值類型的隱式基類,但是您不能創建直接從ValueType繼承的類。 取而代之的是,各個編譯器提供語言關鍵字或構造(例如C#中的struct和Visual Basic中的Structure…End Structure)來支持值類型的創建。
繼承發生在編譯器編譯System.Object
的重寫虛擬方法時。 System.ValueType
類僅提供ToString()
, GetHashCode()
等的更適當的重載。如文檔所述,如果使用struct
關鍵字(在C#中),則編譯器將使用這些重載。 這告訴編譯器使用System.ValueType
方法而不是System.Object
方法。
可能是因為值類型或引用類型沒有被繼承。 枚舉也是如此 。 類本身是引用類型,但枚舉是值類型。
一個可能更簡單的示例是,所有值類型都派生自System.Object
,它也是一個引用類型。
int i = 3;
int j = 3;
object io = i;
object jo = j;
此時, io
和jo
是引用i
和j
值副本的引用。 可以使用強制轉換再次提取值:
int i2 = (int)io;
int j2 = (int)jo;
從功能上來說,這大致就像轉換為object
創建了class ValueWrapper<T> { public T value; }
class ValueWrapper<T> { public T value; }
,然后將io
設置為new ValueWrapper<int> { value = i }
。 從io
到int
然后讀取((ValueWrapper<int>)io).value
。
這不完全是發生的情況,但是發生的情況非常相似,因此希望可以充分澄清。
埃里克·利珀特 ( Eric Lippert )在《 C#編程語言第四版》中說 :
這一點經常使新手感到困惑。 我經常被問到:“但是,值類型怎么可能從引用類型中派生出來呢?”我認為這種混淆是由於對“派生自”的含義的誤解而引起的。 派生並不意味着基本類型的內存中的位的布局在派生類型的位的布局中可以找到。 相反,它僅表示存在某種機制,可以從派生類型訪問基本類型的成員。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.