为什么我不能从System.Enum抽象类派生?

MSDN将System.Enum定义为抽象类:

[SerializableAttribute] [ComVisibleAttribute(true)] public abstract class Enum : ValueType, IComparable, IFormattable, IConvertible 

并且MSDN也对抽象类做出了这样的陈述:

无法实例化抽象类。 抽象类的目的是提供多个派生类可以共享的基类的通用定义。

但我根本无法从System.Enum派生。 根据Jeffery Richter在他的书“CLR via C#”中的说法,C#编译器禁止这种推导。

我检查了System.Enum的成员,其中大部分是静态的,这是合理的,因为它无法实例化,静态方法不需要调用对象实例。 但是也有一些实例方法,比如GetHashCode()和GetTypeCode()。

所以,我的第一个问题是,如果System.Enum无法实例化或派生,那么如何调用这些实例方法呢? 这不是一种悖论吗?

我知道我可以使用以下方法来调用这些实例方法,但为什么呢? 是否创建了某种System.Enum或派生类型对象实例 ? 什么时候? 由谁?

 public enum Days:byte { Saturday, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday }; Days d = Days.Friday; d.GetTypeCode(); d.GetHashCode(); 

你可以从Enum派生,例如

 public enum MyEnum { // ... } 

将编译为类似的东西:

 .class public auto ansi sealed MyEnum extends System.Enum { // ... } 

C#编译器的限制是它不允许您手动编写派生,而是要求您在声明类型时使用enum关键字。

至于为什么这是……我的猜测是因为CLR中的枚举有点奇怪。 例如, ValueTypeEnum基类型本身都是引用类型,而不是值类型。 在封面下有一大堆魔法,如果你强制使用关键字并阻止从魔术基类派生,那么你就会将你的意图与魔法分开。

枚举是值类型,为什么你不能实现或从中派生出来。 实例方法(如GetHashCode())仅适用于类等参考类型对象。