Pourquoi ne puis-je pas dériver de la classe abstraite System.Enum?

MSDN définit System.Enum en tant que classe abstraite:

[SerializableAtsortingbute] [ComVisibleAtsortingbute(true)] public abstract class Enum : ValueType, IComparable, IFormattable, IConvertible 

Et aussi MSDN fait une telle déclaration à propos de la classe abstraite:

Une classe abstraite ne peut pas être instanciée. Le but d’une classe abstraite est de fournir une définition commune d’une classe de base que plusieurs classes dérivées peuvent partager.

Mais je ne peux tout simplement pas dériver de System.Enum. Selon Jeffery Richter dans son livre “CLR via C #”, c’est un compilateur C # qui interdit cette dérivation.

Et j’ai vérifié les membres de System.Enum, la plupart d’entre eux sont statiques, ce qui est raisonnable car il ne peut pas être instancié et les méthodes statiques n’ont pas besoin d’instance d’object à appeler. Mais il existe également des méthodes d’instance, telles que GetHashCode () et GetTypeCode ().

Ainsi, ma première question est la suivante: si System.Enum ne peut pas être instancié ou dérivé, comment ces méthodes d’instance pourraient-elles être appelées? N’est-ce pas une sorte de paradoxe?

Je sais que je pourrais utiliser l’approche suivante pour invoquer ces méthodes d’instance, mais pourquoi? Existe-t-il une sorte d’ instance d’object de type dérivé ou System.Enum créée? Quand? et par qui?

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

Vous pouvez dériver d’ Enum , par exemple

 public enum MyEnum { // ... } 

Sera compilé à quelque chose comme:

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

La ressortingction imposée par le compilateur C # est qu’il ne vous permet pas d’écrire la dérivation manuellement, mais vous oblige à utiliser le mot-clé enum lors de la déclaration du type.

Pour ce qui est de savoir pourquoi … je suppose que les énumérations sont un peu bizarres dans le CLR. Par exemple, les types de base ValueType et Enum sont tous deux des types de référence et non des types de valeur. Il y a tout un tas de magie sous la couverture, et si vous forcez l’utilisation d’un mot clé et empêchez la dérivation de la classe de base magique, vous gardez votre intention séparée de la magie.

Les énumérations sont des types de valeur que vous ne pouvez pas créer ou en déduire. Les méthodes d’instance telles que GetHashCode () ne sont présentes que pour les objects de type référence tels que les classes.