为什么Struct不能从另一个struct派生?

时间:2012-03-02 00:35:00

标签: c# .net clr value-type

我对.Net和CLR的观点更感兴趣:

为什么struct不能是另一个struct的基类,反之亦然?

2 个答案:

答案 0 :(得分:13)

结构占据堆栈中的固定大小的插槽(或者它们居住的任何地方)。

因此,您将无法对结构进行任何类型的多态,因为派生的结构将是不同的大小。

有可能从其他结构继承成员,但由于你无法做任何形式的多重现象,所以不值得混淆。

答案 1 :(得分:1)

在.net中,如果类A继承自类型B并且类型为A的对象传递给期望类型为B的对象的代码,则传递对象不会转换为B,但会保持为A。这是可能的,因为每个对象都存储了对类型描述符的引用。类没有与它们一起存储的任何类型描述​​符。如果类型A的结构可以通过值传递给期望类型为B的结构的例程,则它将成为类型为B的结构。如果这是明智的,那么从类型AB定义扩展转换运算符会更实际。

有时,通过引用期望类型A的例程来传递类型B的结构可能是有用的。转换运营商不会帮助那里。然而,通过使结构类型A只包含B类型的字段,可以处理这种情况,尽管有点笨拙。然后可以通过引用期望类型B的例程来传递该字段;难点在于,必须在任何字段访问中包含内部结构的名称。

什么是有用的,不仅仅是结构,而是类,也是“扩展类型”的概念。所有类,无论是否可继承,都可以使用扩展类型进行扩展,扩展类型只包含实例成员;扩展类型的变量或值将被视为基类型的运行时对象,扩展类型与其基类型之间或从相同基类型派生的扩展类型之间的所有转换都将被视为“加宽”,并且将是作为无操作处理。扩展类型的唯一影响是引入为该类型定义的范围成员。这些行为与扩展方法非常相似,只是它们只适用于声明为扩展类型的变量和变量,扩展类型的成员优先于基类成员。可以想象很多用于这类事情(如果有人想在类的某些实例上使用扩展方法,但可能不希望它们在所有实例上都可用),但是至于我所知道的语言还没有支持这样的特征