C# 为什么可以';我是否从System.Enum抽象类派生?
MSDN将System.Enum定义为抽象类:C# 为什么可以';我是否从System.Enum抽象类派生?,c#,.net,C#,.net,MSDN将System.Enum定义为抽象类: [SerializableAttribute] [ComVisibleAttribute(true)] public abstract class Enum : ValueType, IComparable, IFormattable, IConvertible MSDN也对抽象类做了这样的陈述: [SerializableAttribute] [ComVisibleAttribute(true)] public abstract class E
[SerializableAttribute]
[ComVisibleAttribute(true)]
public abstract class Enum : ValueType, IComparable, IFormattable, IConvertible
MSDN也对抽象类做了这样的陈述:
[SerializableAttribute]
[ComVisibleAttribute(true)]
public abstract class Enum : ValueType, IComparable, IFormattable, IConvertible
不能创建抽象类
实例化。目的
抽象类是为了提供一个公共
基类的定义,该基类
多个派生类可以共享
但我无法从System.Enum派生。根据Jeffery Richter在其著作《CLR通过C#》中的说法,是C#编译器禁止这种派生
我检查了System.Enum的成员,大多数是静态的,这是合理的,因为它不能被实例化,静态方法不需要对象实例来调用。但是也有一些实例方法,比如GetHashCode()和GetTypeCode()
所以,我的第一个问题是,如果System.Enum不能
被实例化或派生,怎么可能
可以调用这些实例方法吗?
这不是一种悖论吗
我知道我可以用下面的
调用这些实例的方法
方法,但为什么?有什么吗
属于System.Enum或派生类型对象
创建实例?什么时候是谁干的
枚举是一种值类型,因此不能实例化或从中派生。GetHashCode()等实例方法仅适用于类等引用类型对象。您可以从
Enum
派生,例如
public enum MyEnum
{
// ...
}
将被编译为如下内容:
.class public auto ansi sealed MyEnum
extends System.Enum
{
// ...
}
C#编译器的限制是它不允许您手动编写派生,而是要求您在声明类型时使用enum
关键字
至于为什么这是。。。我猜是因为CLR中的枚举有点奇怪。例如,
ValueType
和Enum
基类型本身都是引用类型,而不是值类型。封面下有一大堆魔术,如果你强制使用关键字并阻止从魔术基类派生,那么你就把你的意图与魔术分开了。谢谢,格雷格。你的回答部分解决了我的问题。现在我想知道为什么不允许我们直接扩展System.Enum?@smwikipedia-刚刚添加了我的猜测,以解释为什么会这样。不过,你需要找一位C语言设计师来验证(Eric Lippert经常在这里,所以他可能会顺路过来)。谢谢,我已经给Eric Lippert发了一封邮件,希望他能尽快回复。我自己说得再好不过了。:-)请注意,我们也不允许您直接从System.ValueType或System.Delegate派生。像System.Enum这样的类型是非常特殊的类型。我们不能让人们说一些荒谬的话,比如“班级名单:系统。委派”,然后期望它能起作用。谢谢你,埃里克。我现在感觉好多了。8^DDAY确实从枚举中派生。。。你的困惑是什么?