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();
答案 0 :(得分:9)
您可以从Enum
派生,例如
public enum MyEnum
{
// ...
}
将编译为类似:
.class public auto ansi sealed MyEnum
extends System.Enum
{
// ...
}
C#编译器的限制是它不允许您手动编写派生,而是要求您在声明类型时使用enum
关键字。
至于为什么这是......我的猜测是因为CLR中的枚举有点奇怪。例如,ValueType
和Enum
基类型本身都是引用类型,而不是值类型。封面下有一大堆魔法,如果你强制使用关键字并阻止从魔法基类中派生出来,那么你就会将你的意图与魔法分开。
答案 1 :(得分:0)
枚举是值类型,为什么你不能实现或从中派生出来。实例方法(如GetHashCode())仅适用于引用类型对象,例如类。