2010-02-24 5 views
9

MSDN définit System.Enum comme une classe abstraite:Pourquoi ne puis-je pas dériver de la classe abstraite System.Enum?

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

Et aussi MSDN fait cette déclaration au sujet de classe abstraite:

Une classe abstraite ne peut pas être instancié. 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 le 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'une instance d'objet à invoquer. Mais il existe également des méthodes d'instance, telles que GetHashCode() et GetTypeCode().

Alors, ma première question est, si System.Enum ne peut pas être instancié ou dérivé, comment pourrait- ces méthodes d'instance être invoquée? 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? Y a-t-il un type de System.Enum ou un type dérivé objet instance créé? Quand? et par qui?

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

Les jours dérivent d'enum ... quelle est votre confusion? –

Répondre

7

Vous pouvez dériver de Enum, par ex.

public enum MyEnum 
{ 
    // ... 
} 

seront compilés à quelque chose comme:

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

La restriction des lieux du compilateur C# est qu'il ne vous laissera pas é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 c'est ... je pense que c'est parce que les énumérations sont un peu bizarre dans le CLR. Par exemple, les types de base ValueType et Enum sont tous les deux des types de référence, et non des types de valeur. Il y a tout un tas de magie qui se passe sous les couvertures, et si vous forcez l'utilisation d'un mot-clé et empêchez la dérivation de la classe de base magique, alors vous gardez votre intention séparée de la magie.

+0

Merci, Greg. Votre réponse a partiellement résolu mon problème. Maintenant, je me demande pourquoi ne pas nous permettre juste d'étendre le System.Enum directement? – smwikipedia

+0

@smwikipedia - Juste ajouté ma conjecture quant à pourquoi c'est. Il faudrait cependant que l'un des concepteurs du langage C# le vérifie (Eric Lippert est régulièrement ici pour qu'il puisse y passer un peu de chance). –

+0

merci, j'ai envoyé un mail à Eric Lippert et j'espère qu'il pourra bientôt répondre. – smwikipedia

0

énumérations sont le type de valeur que la raison pour laquelle vous ne pouvez pas instanctiate ou tirer. Les méthodes d'instance telles que GetHashCode() sont simplement présentes pour les objets de type référence tels que les classes.

Questions connexes