我在许多文章中都读到,所有值都是从System.ValueType
派生的类型。但是经过一番调查,我发现所有值类型都是struct
或enum
。
我们知道,struct
不支持继承。那么如何从System.ValueType
派生值类型?
答案 0 :(得分:5)
那么值类型是如何从System.Value类型派生的。
基本上是烟雾和镜子。从概念上说,它是从ValueType
派生而来,因此也是从object
派生而来的,它提供对一些常见API的访问,例如ToString()
和Equals
,但它不是实际上是一个对象(除非“装箱”)-涉及很多魔术。例如,当您使用值类型调用.ToString()
时,的含义取决于您是否覆盖了它-它可能是虚拟调用(如果尚未覆盖,则为意思是“装箱”)或一个静态调用(如果有的话);如果编译器不确定(泛型,外部类型等),则可以使用“约束”调用(将决定推迟到JIT之前)。
运行时具有根据需要对值类型进行装箱的能力(尽管不一定有效),并且以装箱形式可以说盒子< / em>源自这些东西。
但是,最终,这里重要的不是struct Foo
是从ValueType
衍生而来的-仅仅是使事情正常进行的实现细节。重要的是,您不能选择任何其他基本类型-与通常从class Bar
派生而可以从其他类派生的object
形成对比。