是什么让ValueType类特别?

当我尝试定义一个inheritance自System.ValueTypeSystem.Enum类的类时,我收到一个错误:

 Cannot derive from special class System.ValueType 

我理解错误,但我无法理解的是什么使ValueType特殊 ? 我的意思是没有关键字(如sealed )或属性来指定不能inheritance此类。 ValueType有两个属性, SerializableComVisible但它们都与这种情况无关。 文档说:

尽管ValueType是值类型的隐式基类,但您无法创建直接从ValueTypeinheritance的类。 相反,单个编译器提供语言关键字或构造(例如C#中的struct和Visual Basic中的Structure … End Structure)以支持值类型的创建。

但它没有回答我的问题。所以我的问题是在这种情况下如何通知编译器? 当我尝试创建一个从类inheritance的类时,编译器是否直接检查该类是ValueType还是Enum

编辑:所有结构都implicitlyinheritance自ValueType ,但Enum显式inheritance自ValueType ,那么它是如何工作的呢? 编译器如何找出这种情况,所有这些都是由编译器硬编码的?

我理解错误,但我无法理解的是什么使ValueType类特殊?

该课程被记录为特殊。 这就是它的特殊之处。

在这种情况下如何通知编译器?

编译器编写者在编写编译器之前会读取文档。

当我尝试创建一个从类inheritance的类时,编译器是否直接检查该类是ValueType还是Enum?

是。

此外,所有结构都隐式inheritance自ValueType,但Enum类显式inheritance自ValueType,那么它是如何工作的呢?

它工作得很好。

是否所有这些特殊情况都硬编码到编译器中?

是。

是否更适合创建一个属性来指定此类是特殊的并且不能inheritance而不是硬编码?

不,这不对。 这意味着第三方也可以创建一个特殊类型,在inheritance时需要编译器进行特殊处理。 然后,第三方将如何修改编译器以实现这些规则?

Microsoft不会发布其C#编译器源代码,因此我们只能猜测检查是否嵌入在编译器级别。

Mono的C#编译器在编译时执行这种检查,你可以在Class.ResolveBaseTypes方法的第2790行看到,

https://github.com/mono/mono/blob/master/mcs/mcs/class.cs

System.ValueType是编译器的特殊处理类,用于注释值类型。 编译器使用它的方式不同,因为值类型对象的处理方式与引用类型对象的处理方式不同 。 我想这一系列的博客文章可以提供一些关于价值和参考类型之间差异的澄清。 此MSDNpost描述了值引用类型的常见情况,以便您可以轻松地对每种类型进行分类。

您的问题的答案是在.NET 公共类型系统中 。 如果你想创建自己的值类型类,我建议创建一个结构 。 复制自(常见TYP系统,结构参考)( http://msdn.microsoft.com/en-us/library/zcx1eb1e%28v=vs.110%29.aspx#Structures ):

结构是从System.ValueType隐式派生的值类型, System.ValueType又从System.Object派生。 …在.NET Framework类库中,所有基本数据类型( BooleanByte, Char, DateTimeDecimalDoubleInt16Int32Int64SByteSingleUInt16UInt32UInt64 )都被定义为结构。

与类一样,结构定义数据(结构的字段)和可以对该数据执行的操作(结构的方法)。 …

值类型在几个方面也与类不同。 首先,虽然它们隐式inheritance自System.ValueType ,但它们不能直接从任何类型inheritance 。 类似地, 所有值类型都是密封的,这意味着不能从它们派生任何其他类型 。 …

对于每种值类型,公共语言运行库提供相应的盒装类型 ,该类型具有与值类型相同的状态和行为。 … 定义值类型时,您将同时定义盒装和未装箱类型

希望我帮忙!