如何/为什么值类型可以从引用类型派生?
在.NET
,所有值类型都从名为System.ValueType的类inheritance。 System.ValueType
是一个类,因此它是一个reference type
。
我的问题是value type
如何以及为什么可能从reference type
派生?
以下是文档中的关键段落
尽管ValueType是值类型的隐式基类,但您无法创建直接从ValueTypeinheritance的类。 相反,单个编译器提供语言关键字或构造(例如C#中的struct和Visual Basic中的Structure … End Structure)以支持值类型的创建。
当编译器编译System.Object
的重写虚方法时,就会发生inheritance。 System.ValueType
类只是提供了更合适的ToString()
, GetHashCode()
等重载。正如文档所述,如果使用struct
关键字,编译器会使用这些重载(在C#中)。 这告诉编译器使用System.ValueType
方法而不是System.Object
方法。
这是可能的,因为不会inheritance值类型或引用类型。 这同样适用于Enum 。 类本身是引用类型,但枚举是值类型。
一个可能更简单的例子是所有值类型都派生自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;
在function上,这大致就像转换为object
创建一个class ValueWrapper
在幕后的对象,并将io
设置为new ValueWrapper
。 从io
到int
然后读取((ValueWrapper
。
这不完全是发生的事情,但发生的事情是相似的,这有希望充分澄清。
Eric Lippert在C#编程语言第4版中说 :
这一点经常让新手感到困惑。 我经常被问到,“但是,值类型如何从参考类型中获取?”我认为由于对“源自”的含义的误解而产生混淆。 推导并不意味着基类型的存储器中的位的布局在派生类型的位布局中找到。 相反,它只是暗示存在某种机制,从而可以从派生类型访问基类型的成员。