为什么C#结构不能被inheritance?

我正在通过Jeffery Richter的C#读取CLR,它说struct是一个值types,不能被inheritance。 为什么不? 任何技术原因? 还是哲学的?

编辑:显然,这个职位有严重的编辑问题。 请参阅评论部分。

两者中的一小部分。

从哲学的angular度来说 ,它是有效的 – 有一些类是面向对象编程的“真正”构造块,有一些结构体,它们是用于存储的轻量级数据types,但允许类似于对象的方法调用以获得熟悉和方便。

从技术上讲 ,“值types”意味着整个结构 – 它的所有内容 – 通常存储在任何具有该typesvariables或成员的地方。 作为局部variables或函数参数,这意味着在堆栈上。 对于成员variables,这意味着完全存储为对象的一部分。

作为inheritance是一个问题的(主要)例子,考虑如果允许结构体具有更多成员的子types,存储在低级别上的影响如何。 任何存储该结构types的东西都会根据它所包含的子types占用不同数量的内存,这将成为分配的噩梦。 给定类的对象在编译时将不再具有常量,已知的大小,对于任何方法调用的堆栈帧来说也是如此。 这不会发生在堆上分配了存储空间的对象,而是在堆栈上或其他对象内部具有恒定大小的引用。

这只是一个直观的,高层次的解释 – 查看扩展和更精确信息的评论和其他答案。

因为这是结构以.NET表示的方式。 它们是值types,值types没有允许inheritance的方法表指针。

你可能会find答案的问题为什么.NET值types密封? 相关。 其中@logicnp是指ECMA 335 ,其中指出:

8.9.10值typesinheritance

  • […]
  • 将被密封以避免处理价值切片的复杂性。
  • 这里指定的更严格的规则允许更有效的实现,而不会严重影响function。