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

smw*_*dia 10 .net c#

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

[SerializableAttribute]
[ComVisibleAttribute(true)]
public abstract class Enum : ValueType, IComparable, IFormattable, IConvertible
Run Code Online (Sandbox Code Playgroud)

并且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();
Run Code Online (Sandbox Code Playgroud)

Gre*_*ech 9

你可以从中获得Enum,例如

public enum MyEnum
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

将被编译为类似的东西:

.class public auto ansi sealed MyEnum
    extends System.Enum
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我自己也说得不错.:-)请注意,我们也不允许您直接从System.ValueType或System.Delegate派生.像System.Enum这样的类型是*非常特殊的类型*.我们不能让人们说"类List <T>:System.Delegate"这样荒谬的事情并期望它能够发挥作用. (3认同)