在.NET
中,所有值类型都从名为System.ValueType的类继承。 System.ValueType
是一个类,因此它是reference type
。
我的问题是value type
来自reference type
的可能性和原因是什么?
答案 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;
此时,io
和jo
是引用i
和j
值的副本的引用。可以使用强制转换再次提取值:
int i2 = (int)io;
int j2 = (int)jo;
从功能上讲,这大致类似于转换为object
在幕后创建class ValueWrapper<T> { public T value; }
对象,io
设置为new ValueWrapper<int> { value = i }
。从io
到int
的演员表会读取((ValueWrapper<int>)io).value
。
这不完全是发生的事情,但发生的事情是相似的,这有希望充分说明。
答案 3 :(得分:0)
Eric Lippert在The C# Programming Language 4th Edition中说:
这一点经常让新手感到困惑。我经常被问到,“但是 值类型如何从引用类型派生?“我 认为混淆是由于对什么的误解而产生的 “源自”的意思。推导并不意味着布局 基本类型的内存中的位是布局中的某个位置 派生类型中的位。相反,它只是意味着一些 存在这样的机制,从而可以访问基类型的成员 派生类型。