struct 是值类型的怎么能继承呢.
所有的值类型都不能被继承.
@lookuptable
这话可就不对了,看看System.Enum去
主要原因是“结构是隐式密封的”吗?
我觉得是因为struct是派生自System.ValueType吧,就想int, bool等一样,.net里所有从ValueType继承来的Type都不能被继承的。
@lookuptable ,追忆似水年华
与引用类型不同,从值类型不可能派生出新的类型。但与引用类型相同的是,结构也可以实现接口。
结构是隐式密封的;因此它们不能被继承。
另外,我想,如果综合两个原因可能答案更加准确。
也许还有其它的解释,期待......
主要的一点我赞同,就是struct在编译时将被隐式的添加sealed修饰符,也就是说以下两个声明时等同的:
public struct MyType {}
public sealed class MyType : System.ValueType ()
但之所以等同并非编译器只是针对struct类型这样处理,而是对所有继承自ValueType的type都这样处理,应该也包括Enum。
对于Enum,C#编译器同样禁止显式的将System.Enum作为基类型,只能使用enum的方式来创建。enum在使用上与C#里其它值相比还是特殊一些。
关于struct和enum与ValueType的关系,在“.NET本质论”一书的第五章开头部分论述的比较清楚。
所以我觉得“结构是隐式密封的”应该是一个直接原因,而本质原因还是因为struct是从ValueType派生的值类型。
C#禁止继承自ValueType, Enum, Array, Delegate等类是因为你无法自己用语法创建出值类型或者数组,委托这些东西,继承关系只是用来维护.NET的对象模型。要创建他们非要靠编译器的支持不可。
我试了一下IL级别的游戏:
1、即使用ilasm,也不允许继承自ValueType的类型不为sealed。看来这是一条相当硬性的规定。
2、虽然有上面那一条限制,但我还是成功继承自一个struct,很神奇吧。IL级别干坏事就是容易。我还继承了Enum, Array和Delegate,他也没吭声……
所以,那限制只是C#玩的游戏罢了,struct理论上是可以继承的……
@lookuptable ,Ninputer
欣赏两位的探索精神!
我最终还是无法破除struct上的sealed,这使得继承出来的类无法使用。(所以事实上还是没能继承自struct,不然又有好玩的了)
ilasm不允许继承自[mscrolib]System.ValueType的类型不带sealed,但却允许继承自System.ValueType的类型不带sealed,这说明什么?只有你是.NET Framework的编写者,才能写出继承自System.ValueType并且不是sealed的类,比如System.Enum。其他人……免了。
发现一个好玩的问题:
System.Object
System.ValueType
System.Double
Double 是一个结构
public struct Double : IComparable, IFormattable, IConvertible
System.Object
System.ValueType
System.Enum
派生类
Enum是一个类,它有继承类
public abstract class Enum : IComparable, IFormattable,IConvertible
信息来源:MSDN2003