ValueTypes如何从Object(ReferenceType)派生而仍然是ValueTypes?

时间:2009-11-05 17:31:27

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

C#不允许从类派生结构,但所有ValueType都派生自Object。这种区别在哪里?

CLR如何处理这个问题?

5 个答案:

答案 0 :(得分:100)

答案 1 :(得分:19)

这是一个由CLR维护的有点人为的构造,以便允许所有类型被视为System.Object。

值类型派生自System.Object到System.ValueType,这是特殊处理发生的地方(即:CLR处理从ValueType派生的任何类型的装箱/拆箱等)。

答案 2 :(得分:19)

小修正,C#不允许结构来自任何东西,而不仅仅是类。所有结构都可以实现一个与派生非常不同的接口。

我认为回答这个问题的最好方法是ValueType很特别。它本质上是CLR类型系统中所有值类型的基类。很难知道如何回答“CLR如何处理这个问题”,因为它只是CLR的一个规则。

答案 3 :(得分:5)

  

你的陈述不正确,因此你的困惑。 C#允许结构派生自类。所有结构都派生自同一个类System.ValueType

让我们试试这个:

 struct MyStruct :  System.ValueType
 {
 }

这甚至都不会编译。编译器会提醒您“接口列表中的类型'System.ValueType'不是接口”。

当反编译作为结构的Int32时,你会发现:

public struct Int32 : IComparable, IFormattable, IConvertible {},未提及它是从System.ValueType派生的。但是在对象浏览器中,您确实发现Int32继承自System.ValueType。

所有这些让我相信:

  

我认为回答这个问题的最好方法是ValueType很特别。它本质上是CLR类型系统中所有值类型的基类。很难知道如何回答“CLR如何处理这个问题”,因为它只是CLR的一个规则。

答案 4 :(得分:2)

盒装值类型实际上是一种引用类型(它像一个一样行走,像一个一样嘎嘎叫,所以实际上就是一个)。我建议ValueType实际上不是值类型的基本类型,而是在转换为Object类型时可以转换值类型的基本引用类型。非盒装值类型本身位于对象层次结构之外。