为什么我不能从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中的枚举有点奇怪。 例如, ValueType
和Enum
基类型本身都是引用类型,而不是值类型。 在封面下有一大堆魔法,如果你强制使用关键字并阻止从魔术基类派生,那么你就会将你的意图与魔法分开。
枚举是值类型,为什么你不能实现或从中派生出来。 实例方法(如GetHashCode())仅适用于类等参考类型对象。