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)
你可以从中获得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中的枚举有点奇怪.例如,ValueType
和Enum
类型本身都是引用类型,而不是值类型.在封面下有一大堆魔法,如果你强制使用关键字并阻止从魔术基类派生,那么你就会将你的意图与魔法分开.
归档时间: |
|
查看次数: |
2050 次 |
最近记录: |