inheritance自struct
我试着弄明白我的代码有什么问题。 我有这个代码:
public struct MyStructA { public MyStructA(string str) { myString= str; } public string myString; } public struct MyStructB: MyStructA { public string myReversString; }
我得到这个错误:
Error at compile time: Type 'MyStructA' in interface list is not an interface
我不明白为什么? .net不像类那样实现struct?
结构是隐式密封的
根据这个链接 :
C#中的每个结构,无论是用户定义的还是在.NET Framework中定义的,都是密封的 – 这意味着您无法inheritance它。 结构被密封,因为它是一个值类型,并且所有值类型都是密封的。
struct可以实现一个接口,因此可以在结构名称之后看到冒号后面的另一个类型名称。
在下面的示例中,当我们尝试定义从上面定义的inheritance的新结构时,我们得到编译时错误。
public struct PersonName { public PersonName(string first, string last) { First = first; Last = last; } public string First; public string Last; } // Error at compile time: Type 'PersonName' in interface list is not an interface public struct AngryPersonName : PersonName { public string AngryNickname; }
Struct不支持inheritance,如果你需要使用class,请参阅msdn
结构没有inheritance,就像类一样。 结构不能从另一个结构或类inheritance,也不能作为类的基础。 但是,Structsinheritance自基类Object。 结构可以实现接口,它就像类一样完成。
.NET中的值类型很奇怪,因为它们是定义的,虽然它们是从名为ValueType
的特殊类派生的类。 对于每个值类型,都有一个堆对象类型,其行为类似于从ValueType
派生的类对象,但值类型存储位置包含一个字节集合,这些字节表示原始值,或者是保存所有字节所需的字节串联其公共和私人领域。
由于值类型存储位置只保存表示其值所需的字节,并且既不保存类型信息也不保存对包含类型信息的对象的任何引用,因此使用值类型存储位置的代码必须确切地知道它是什么。
传统的inheritance要求对象保存有关其自身类型的信息,但没有规定值类型可以这样做。
.NET在概念上可能(并且有用)允许一些有限forms的值类型inheritance和一些特殊规则,这样虽然BaseStructure
变量只能容纳BaseStructure
并且不能保存DerivedStructure
。 可以定义一个StructureUser
,这样的类或方法可以接受BaseStructure
任何衍生物,并使用那些基本类型共有的成员 – 包括字段。
遗憾的是,很难为generics定义规则,以便在允许的场景中表现一致,但不会破坏任何现有代码。
例如,在类Foo
总是可以将T
存储到U
类型的变量,即使U
是值类型(即因为值类型被密封, T
和U
被保证是相同的类型)。 如果U
可以是可inheritance的值类型而T
可以是衍生的,那么这种保证就不会成立。
鉴于与此类inheritance相关的困难,更有用的替代方法是提供一种安全(即使是有限的)方法,通过该方法,属性可以公开byref或const-byref(byref是参数使用时传递的东西) ref
资格赛)。
这样的特征将消除字段和属性之间不可避免的语义区别,并且取决于它的实现方式即使与类一起使用也可以提供一些主要优点(例如,它可以允许有效混合不可变类型和可变类型)。
结构之间不允许inheritance,但结构可以实现接口。
结构可以实现接口,但它们不能从其他结构inheritance。 因此,struct成员不能声明为protected。
来自MSDN
;
结构没有inheritance,就像类一样 。 结构不能从另一个结构或类inheritance,也不能作为类的基础。 但是,Structsinheritance自基类Object。 结构可以实现接口,它就像类一样完成。
但请记住,因为结构是一种值类型 ,它们inheritanceSystem.ValueType