Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么可以';我是否从System.Enum抽象类派生?_C#_.net - Fatal编程技术网

C# 为什么可以';我是否从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

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

[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确实从枚举中派生。。。你的困惑是什么?