我想知道为什么.NET值类型不支持继承(忽略接口实现)有任何技术原因......我不能乍一看为什么值类型不应该允许单一的原因基类继承。
(我的意思是,如果你最终得到一个巨大的继承层次结构,那么值类型的继承会很糟糕,但我主要想知道是否有任何运行时限制而不是实际限制。)
感谢。
答案 0 :(得分:28)
考虑为值类型分配的内存。 CLR确切地知道为值类型的变量分配多少空间,因为它知道将存在哪些字段。它不可能以具有更多字段的子类型值结束。
现在我们可能具有值截断事物的值类型继承:
ExtendedValueType evt = new ExtendedValueType(...);
BaseValueType bvt = evt;
// Now you couldn't cast back to ExtendedValueType, because we'd have lost
// information
同样,类型信息无法存在于值本身中,因此任何被扩展类型覆盖的虚拟方法都不会通过bvt
调用,因为就所有事情而言,值都是< em>只是值BaseValueType
。换句话说,很多“自然”继承特征会以某种我认为会引起很多混淆的方式丢失。
答案 1 :(得分:6)
我认为值类型不支持继承的原因是它们在内存中的表示方式。由值类型表示的数据的大小和因此取决于其组成字段。也就是说,如果您的值类型包含int和字符串,则32位系统上的总大小将为8或4(int的大小)+ 4(指针的大小)。这意味着值类型在内存中表示是一个字节块,没有更多信息。
现在与类类型相比,它们都是指针大小,或32位系统上的4。由于类类型的实例是指针,因此它们可以引用继承所需的内容,例如VMT(虚方法表)和对父类信息的引用。这是值类型无法做到的事情,因此值类型不支持继承。
答案 2 :(得分:3)
假设可以完成。
您可以重复使用某些实现。
但继承的真正好处是替代和多态。它们需要逐个引用。
这就是支持接口实现 的原因,因为它总是涉及Boxing。但这不适用于继承。