C#不允许从类派生结构,但所有ValueType都派生自Object。这种区别在哪里?
CLR如何处理这个问题?
答案 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类型时可以转换值类型的基本引用类型。非盒装值类型本身位于对象层次结构之外。