如何/为什么值类型可以从引用类型派生?

.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; 

此时, iojo是引用ij值的副本的引用。 可以使用强制转换再次提取值:

 int i2 = (int)io; int j2 = (int)jo; 

在function上,这大致就像转换为object创建一个class ValueWrapper { public T value; } 在幕后的对象,并将io设置为new ValueWrapper { value = i } 。 从ioint然后读取((ValueWrapper)io).value

这不完全是发生的事情,但发生的事情是相似的,这有希望充分澄清。

Eric Lippert在C#编程语言第4版中说 :

这一点经常让新手感到困惑。 我经常被问到,“但是,值类型如何从参考类型中获取?”我认为由于对“源自”的含义的误解而产生混淆。 推导并不意味着基类型的存储器中的位的布局在派生类型的位布局中找到。 相反,它只是暗示存在某种机制,从而可以从派生类型访问基类型的成员。