是什么让ValueType类与众不同?当我尝试定义一个继承自System.ValueType或System.Enum类的类时,出现错误:无法派生自特殊类System.ValueType我理解该错误,但我不明白是什么使ValueType班级特?我的意思是没有关键字(如sealed)或属性来指定此类不能被继承。ValueType有两个属性,Serializable和ComVisible,但它们都与本例无关。文档说:尽管ValueType是值类型的隐式基类,但您不能创建直接从ValueType继承的类。相反,各个编译器提供语言关键字或结构(例如C#中的struct和VisualBasic中的Structure…EndStructure)来支持值类型的创建。但它没有回答我的问题。所以我的问题是在这种情况下如何通知编译器?当我尝试创建一个继承自某个类的类时,编译器会直接检查该类是ValueType还是Enum?编辑:所有结构都隐式继承自ValueType,但Enum类显式继承自ValueType,那么它是如何工作的?编译器怎么弄清楚这种情况,都是编译器硬编码的?我理解错了,但我无法理解的是,是什么让ValueType类变得特别?该课程被记录为特殊课程。这就是它的特别之处。在这种情况下如何通知编译器?编译器作者在编写编译器之前阅读文档。当我尝试创建一个继承自某个类的类时,编译器会直接检查该类是ValueType还是Enum?是的。另外,所有结构都隐式继承自ValueType,但Enum类显式继承自ValueType,那么它是如何工作的呢?它工作得很好。所有这些特殊情况都硬编码到编译器中了吗?是的。创建一个属性来指定这个类是特殊的并且不可继承而不是硬编码它不是更合适吗?不,这是不对的。这意味着第三方也可以创建一个特殊的类型,这需要编译器在继承时进行特殊处理。那么,第三方如何修改编译器来实现这些规则呢?Microsoft没有发布其C#编译器源代码,因此我们只能猜测检查是否嵌入在编译器级别。Mono的C#编译器在编译时执行此检查,您可以在Class.ResolveBaseTypes方法的第2790行看到,https://github.com/mono/mono/blob/master/mcs/mcs/class。csSystem.ValueType是编译器注解值类型的特殊处理类。编译器使用它的方式不同,因为值类型对象的处理方式与引用类型对象不同。我认为这一系列的博文可以澄清值类型和引用类型之间的区别。这篇MSDN帖子描述了值引用类型的常见情况,以便您可以轻松地对每种类型进行分类。您的问题的答案在.NET通用类型系统中。如果你想创建自己的值类型类,我建议创建一个结构。复制自(通用TYP系统,结构参考)(http://msdn.microsoft.com/en-us/library/zcx1eb1e%28v=vs.110%29.aspx#Structures):结构是从System.ValueTypeA中隐含的派生值类型,System.ValueType又派生自System.Object。...在.NETFramework类库中,所有原始数据类型(Boolean、Byte、Char、DateTime、Decimal、Double、Int16、Int32、Int64、SByte、Single、UInt16、UInt32和UInt64)都定义为结构。与类一样,结构定义数据(结构的字段)和可以对该数据执行的操作(结构的方法)。…值类型在几个方面也不同于类。首先,虽然它们隐式继承自System.ValueType,但它们不能直接继承自任何类型。同样,所有值类型都是密封的,这意味着不能从它们派生出其他类型。...对于每个值类型,公共语言运行时提供了一个相应的装箱类型,它具有与值类型相同的状态和行为。…定义值类型时,您同时定义了装箱和未装箱类型。希望我帮忙!C#学习教程就是这些:是什么让ValueType类与众不同?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
