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

时间:2010-02-24 08:49:57

标签: c# .net

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();

2 个答案:

答案 0 :(得分:9)

您可以从Enum派生,例如

public enum MyEnum
{
    // ...
}

将编译为类似:

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

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

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

答案 1 :(得分:0)

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