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

时间:2012-11-26 11:38:58

标签: c# .net types value-type reference-type

.NET中,所有值类型都从名为System.ValueType的类继承。 System.ValueType是一个类,因此它是reference type

我的问题是value type来自reference type的可能性和原因是什么?

4 个答案:

答案 0 :(得分:6)

以下是文档中的关键段落

  

虽然ValueType是值类型的隐式基类,但是   无法创建直接从ValueType继承的类。代替,   个人编译器提供语言关键字或构造(例如   结构在C#和Structure ...结构在Visual Basic中)支持   创造价值类型。

当编译器编译System.Object的覆盖虚拟方法时,会发生继承。 System.ValueType类只提供ToString()GetHashCode()等更合适的重载。如文档所述,如果使用struct关键字,则编译器会使用这些重载(在C#中)。这告诉编译器使用System.ValueType方法而不是System.Object方法。

答案 1 :(得分:2)

这是可能的,因为不会继承值类型或引用类型。这同样适用于Enum。类本身是引用类型,但枚举是值类型。

答案 2 :(得分:1)

一个可能更简单的例子是所有值类型都来自System.Object,它也是一种引用类型。

int i = 3;
int j = 3;
object io = i;
object jo = j;

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

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

从功能上讲,这大致类似于转换为object在幕后创建class ValueWrapper<T> { public T value; }对象,io设置为new ValueWrapper<int> { value = i }。从ioint的演员表会读取((ValueWrapper<int>)io).value

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

答案 3 :(得分:0)

Eric LippertThe C# Programming Language 4th Edition中说:

  

这一点经常让新手感到困惑。我经常被问到,“但是   值类型如何从引用类型派生?“我   认为混淆是由于对什么的误解而产生的   “源自”的意思。推导并不意味着布局   基本类型的内存中的位是布局中的某个位置   派生类型中的位。相反,它只是意味着一些   存在这样的机制,从而可以访问基类型的成员   派生类型。