Enumeration [Résolu]

Signaler
Messages postés
403
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
31 août 2008
-
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
-
J'ai une question concernant les enumérations. Voici d'abord le bout de code que j'essai de comprendre :

using
System;


public class intro
{
enum mention {Passable,AssezBien,Bien,TrèsBien, Excellent};
public static void Main()
{
mention maMention=mention.Passable;
foreach(mention m in
Enum.GetValues(maMention.GetType()))
{

Console.Out.WriteLine(m);
}
}
}

Pourquoi ne peux t-on pas remplacer "maMention.GetType()" par "mention". mention n'est-il pas le type de maMention ?


Mathmax

14 réponses

Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
92
"Ok donc si j'ai bien compris :
1) L'opérateur GetValue attend le type de l'instance Mamention (c.a.d en fait "mention" mais celle-ci ne peut-être mis directement dans Getvalue pour des problèmes de syntaxe *).
2) C'est pourquoi on doit d'abord créer une instance de "mention" puis récupérer son type avec GetType. L'opérateur typof permet de se passer de l'instance, il récupère directement de type de mon type mention.*
3) Est-ce vraiment pour une histoire de syntaxe ou alors mention n'est il tout simplement pas un Type?
Ou alors, est-ce un type mais pas seulement et c'est pourquoi on ne veux que récupérer son type avec des opérateurs comme GetType et Typof ?
4) Question : Qu'appelles-tu "classe Type" ? Est-ce que classe type = type ?"

0) Tu as ouvert les pages de la doc que j'ai linkées ?

1)
L'opérateur GetValue attend le type de l'instance Mamention
=> GetValues est une méthode, pas un opérateur, qui attend une instance de la classe =/library/fre/cpref/html/frlrfsystemtypeclasstopic.asp System.Type en paramètre.
/library/fre/cpref/html/frlrfsystemtypeclasstopic.asp System.Type servant à décrire un type.
b) (c.a.d en fait "mention" mais celle-ci ne peut-être mis directement dans Getvalue pour des problèmes de syntaxe *).
> non, ce n'est pas "mention", mais une instance de la classe System.Type qui représente le type "mention", ce n'est pas un problème de syntaxe.

2) C'est pourquoi on doit d'abord créer une instance de "mention" puis récupérer son type avec GetType. L'opérateur typof permet de se passer de l'instance, il récupère directement de type de mon type mention.*
Parfaitement, surtout la 2eme partie.

3) Est-ce vraiment pour une histoire de syntaxe ou alors mention n'est il tout simplement pas un Type?Ou alors, est-ce un type mais pas seulement et c'est pourquoi on ne veux que récupérer son type avec des opérateurs comme GetType et Typof ?
"mention" est un type (type classe en l'occurence), mais pas une instance de la classe =/library/fre/cpref/html/frlrfsystemtypeclasstopic.asp System.Type

4) Question : Qu'appelles-tu "classe Type" ? Est-ce que classe type = type ?"
la classe System.Type est une classe du Framework, comme c'est expliquer sur la page de la doc la concernant.
classe =/library/fre/cpref/html/frlrfsystemtypeclasstopic.asp Type != terme type.

GetValues, méthode : http://msdn.microsoft.com/library/fre/default.asp?url=/library/fre/cpref/html/frlrfSystemEnumClassGetValuesTopic.asp

System.Type, classe : http://msdn.microsoft.com/library/fre/default.asp?url=/library/fre/cpref/html/frlrfsystemtypeclasstopic.asp

/*
coq
MVP Visual C#
*/
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
92
Salut,

Non, car GetValues attend une instance de System.Type.
Par contre tu peux utiliser typeof.

foreach(mention m in Enum.GetValues(typeof(mention)))
{
Console.Out.WriteLine(m);
}

/*
coq
MVP Visual C#
*/
Messages postés
403
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
31 août 2008

Désolé je débute en C#, je ne comprends pas trop cette phrase : "Non, car GetValues attend une instance de System.Type." Pourrais tu me l'expliquer ?


Mathmax
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
92
public static Array GetValues(
Type enumType
);

La méthode GetValues attend en paramètre (enumType) une instance de la classe Type représentant ton enum, chose que permettent d'obtenir la méthode GetType et le mot clé typeof.

/*
coq
MVP Visual C#
*/
Messages postés
403
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
31 août 2008

"mention" n'est pas justement une instance de la classe Type enum ? Sinon quelle est cette intance ?


Mathmax
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
92
Non, mention est un type, mais pas une instance de la classe Type (qui décrit un type), et on obtient cette instance de plusieurs façons :
- utilisation de la méthode Object.GetType comme tu l'avais fait
- utilisation de l'opérateur typeof
- utilisation de la méthode Type.GetType

/*
coq
MVP Visual C#
*/
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
38
Hop juste pour compliquer l'explication de Coq :

maMention est une instance de la classe Enum !

( écris tes types ( classe, struct, enum ) avec une majuscule ).
Messages postés
403
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
31 août 2008

Dans ce cas, si "maMention est une instance de la classe Enum" et "si GetValues attend en paramètre (enumType) une instance de la classe Type représentant ton enum", pourquoi ne peut-on pas écrire : GetValues(maMention))?
Désolé d'insister mais il doit y avoir quelque chose qui m'échappe.

Mathmax
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
92
Parce que les développeurs n'ont pas juger nécessaire de développer cette surcharge là je pense.

/*
coq
MVP Visual C#
*/
Messages postés
403
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
31 août 2008

Ok donc si j'ai bien compris :

L'opérateur GetValue attend le type de l'instance Mamention (c.a.d en fait "mention" mais celle-ci ne peut-être mis directement dans Getvalue pour des problèmes de syntaxe *). C'est pourquoi on doit d'abord créer une instance de "mention" puis récupérer son type avec GetType.
L'opérateur typof permet de se passer de l'instance, il récupère directement de type de mon type mention.

* Est-ce vraiment pour une histoire de syntaxe ou alors mention n'est il tout simplement pas un Type? Ou alors, est-ce un type mais pas seulement et c'est pourquoi on ne veux que récupérer son type avec des opérateurs comme GetType et Typof ?

Question : Qu'appelles-tu "classe Type" ? Est-ce que classe type = type ?

Mathmax
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
38
Imagine que la classe Type ce soit appelée Info, là y'aurait plus d'ambiguïté.
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
92
C'est sur :p

/*
coq
MVP Visual C#
*/
Messages postés
403
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
31 août 2008

Après avoir lu un bon bout de tutoriel, je comprends mieux ce que tu m'a expliqué coq. Il me manquait pas mal de notions sur les classes, les types, les propriétés... Merci beaucoup pour la patience dont tu as fait preuve.


Mathmax
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
92
Pas de problème

/*
coq
MVP Visual C#
*/