gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:09:40 24 4
gpt4 key购买 nike

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

[SerializableAttribute]
[ComVisibleAttribute(true)]
public abstract class Enum : ValueType, IComparable, IFormattable, IConvertible

而且MSDN对抽象类也有这样的说法:

An abstract class cannot be instantiated. The purpose of an abstract class is to provide a common definition of a base class that multiple derived classes can share.

但我根本无法派生自 System.Enum。根据 Jeffery Richter 在他的书“CLR via C#”中的说法,C# 编译器禁止这种推导。

而且我查看了System.Enum的成员,大部分都是静态的,这是合理的,因为它不能被实例化,静态方法不需要对象实例来调用。但也有一些实例方法,例如 GetHashCode() 和 GetTypeCode()。

So, my first question is, if System.Enum cannot be instantiated or derived, how could these instance methods be invoked? Isn't this some kind of a paradox?

I know I could use the following approach to invoke these instance methods, but why? Is there some kind of System.Enum or derived type object instance created? When? and by whom?

public enum Days:byte { Saturday, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday };
Days d = Days.Friday;
d.GetTypeCode();
d.GetHashCode();

最佳答案

您可以从 Enum 派生,例如

public enum MyEnum
{
// ...
}

将被编译成如下内容:

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

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

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

关于c# - 为什么我不能从 System.Enum 抽象类派生?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2324667/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com