Je veux savoir pourquoi nous ne pouvons pas avoir "char" comme type enum sous-jacent . Comme nous avons byte, sbyte, int, uint, long, ulong, court, ushort comme sous-type. Deuxièmement, quel est le type sous-jacent par défaut d'une énumération?
Le type par défaut est int. Plus d'informations sur C # référence sur MSDN. Vous pouvez également trouver un lien vers la spécification du langage C # à l'adresse MSDN. Je pense que la raison de la restriction provient probablement de ces déclarations dans la spécification de langage, section 4.1.5.
Le type de caractère est classé en tant que type intégral, mais il diffère du d'autres types intégraux de deux manières:
• Il n'y a pas de conversions implicites des autres types au type char. Dans particulier, même si le sbyte, octet, et les types ushort ont des plages de des valeurs entièrement représentables en utilisant le type char, implicite conversions de sbyte, byte ou ushort to char n'existe pas.
• Les constantes du type char doivent être écrit en caractères littéraux ou en littéraux entiers en combinaison avec un cast to type char. Par exemple, (char) 10 est identique à '\ x000A'.
Je sais que c'est une question plus ancienne, mais cette information m'aurait été utile:
Il semble qu’il n’y ait aucun problème à utiliser char en tant que type de valeur pour les énumérations dans C # .NET 4.0 (peut-être même 3.5, mais je n’ai pas testé cela). Voici ce que j'ai fait et cela fonctionne complètement:
public enum PayCode {
NotPaid = 'N',
Paid = 'P'
}
Convertir Enum en caractère:
PayCode enumPC = PayCode.NotPaid;
char charPC = (char)enumPC; // charPC == 'N'
Convertir le caractère en enum:
char charPC = 'P';
if (Enum.IsDefined(typeof(PayCode), (int)charPC)) { // check if charPC is a valid value
PayCode enumPC = (PayCode)charPC; // enumPC == PayCode.Paid
}
Fonctionne comme un charme, comme on peut s'y attendre du type char!
C'est la solution que j'utilise
enum MyEnum
{
AA = 'A',
BB = 'B',
CC = 'C'
};
static void Main(string[] args)
{
MyEnum e = MyEnum.AA;
char value = (char)e.GetHashCode(); //value = 'A'
}
Techniquement, vous ne pouvez pas faire ça. Mais vous pouvez convertir l'énumération en octet puis la convertir en caractères. Ceci est utile si votre objectif est d’avoir quelque chose comme ça (en réalisant que c’est impossible à faire:
public enum CharEnum
{
one = '1'
}
Vous pouvez toutefois le faire en utilisant les valeurs d'octets ASCII puis en convertissant:
public enum CharEnum
{
one = 49,
two = 50
}
Vous pouvez ensuite convertir en octet et en caractère pour obtenir la valeur de caractère. Ce n’est pas vraiment joli, mais cela fonctionnera si l’objectif ultime est d’avoir un personnage. Vous pouvez également utiliser unicode et une valeur int si vous avez besoin de caractères extérieurs à la plage ASCII. :-)
Voir le standard ECMA 335, Common Language Infrastructure (CLI), dans Ecma International . La CLI autorise le type sous-jacent à être char ou bool mais C # et VB.Net ne le permettent pas. Pour ce que cela vaut, C++/CLI autorise System :: Char comme type sous-jacent.
Je suppose que C # et VB.Net n'autorisent pas char et bool comme type sous-jacent pour des raisons syntaxiques uniquement.
char charPC = 'P';
if (Enum.IsDefined(typeof(PayCode), (PayCode)charPC)) {
// check if charPC is a valid value
PayCode enumPC = (PayCode)charPC; // enumPC == PayCode.Paid
}