2009-02-21 8 views

Répondre

15

Le type par défaut est int. Plus d'informations au C# reference sur MSDN. Vous pouvez également trouver un lien vers le C# language specification sur MSDN. Je pense que la raison de la restriction découle probablement de ces énoncés dans la spécification du langage, section 4.1.5.

Le type char est classé comme un type intégral, mais il diffère des autres types intégraux de deux façons:

• Il n'y a pas de conversions implicites d'autres types de type char. En particulier , même si le sbyte, octets, et les types ushort ont des gammes de valeurs qui sont entièrement représentable en utilisant le type char, implicites conversions de sbyte, octet, ou ushort à CHAR n'existent pas.

• Constantes du type char doit être écrit comme caractère littéraux ou comme entier littéraux en combinaison avec un casting de type char. Par exemple, (char) 10 est identique à '\ x000A'.

-4

Les énumérations de caractères seraient simplement des chaînes, n'est-ce pas? Je ne suis pas sûr de savoir quel autre avantage tirerait d'un dénombrement de personnage?

Comme d'autres l'ont dit, le type par défaut est int pour une énumération.

+2

Il est utile lors de la conversion à partir d'une colonne de base de données qui est un NCHAR (0001) et l'énumération. Plus précisément, il est utile d'avoir quelque chose de logique quand on le regarde dans un select, mais il est limité à un ensemble spécifique de valeurs. À titre d'exemple: Statut. En attente: 'P', En cours: 'Je', Terminé avec succès: 'S', Échec: 'F'. –

+0

Je seconde le commentaire de la base de données car c'est exactement ce qui m'a conduit à cette question. – Nathan

3

Techniquement, vous ne pouvez pas faire cela. Mais, vous pouvez convertir l'enum en octet, puis le convertir en char. Ceci est utile si votre objectif est d'avoir quelque chose comme ça (se rendant compte cela est impossible à faire:

public enum CharEnum 
{ 
    one = '1' 
} 

Vous pouvez faire cela, cependant, en utilisant des valeurs d'octets ASCII et conversion:

public enum CharEnum 
{ 
    one = 49, 
    two = 50 
} 

Vous pouvez ensuite convertir en byte et en char pour obtenir la valeur char.Il n'est pas vraiment joli, mais cela fonctionnera, si vous obtenez un char comme but ultime.Vous pouvez aussi utiliser unicode et une valeur int, si vous avez besoin de caractères à l'extérieur de la gamme ASCII. :-)

13

Ceci est une solution de contournement 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' 
} 
+5

Ou vous pouvez simplement écrire '(char) e' sans' GetHashCode() '. –

+4

Tout ce dont vous avez besoin est '(char) e'. [Vous encourez une pénalité de boxe en allant pour 'enum.GetHashCode'.] (Http://stackoverflow.com/questions/7995606/boxing-occurrence-in-c-sharp) – nawfal

76

Je sais que cette question est plus, mais cette information aurait été utile pour moi:

Il semble qu'il n'y a pas de problème en utilisant char comme type de valeur pour les énumérations en C# .NET 4.0 (peut-être même 3,5, mais je n'ai pas testé cela).Voici ce que je l'ai fait, et il fonctionne complètement:

public enum PayCode { 
    NotPaid = 'N', 
    Paid = 'P' 
} 

Convertir Enum à carboniser:

PayCode enumPC = PayCode.NotPaid; 
char charPC = (char)enumPC; // charPC == 'N' 

Convertir char 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, tout comme vous attendez du type de char!

+8

a mis en doute votre réponse, mais soyez conscient de l'énumération en réponse a toujours 'int' comme le type sous-jacent. Le compilateur le traite comme 'int'. Voulu C# n'a pas eu cette affaire de bord. – nawfal

-1

Presque tout a déjà été dit à ce sujet. Je voulais juste dire que vous pouvez utiliser des extensions si vous utilisez beaucoup de « char énumérations »:

public enum MyEnum 
{ 
    MY_VALUE = 'm' 
} 

public static class MyExtensions 
{ 
    public static char GetChar(this Enum value) 
    { 
     return (char)value.GetHashCode(); 
    } 
} 

class Program 
{ 
    public static void Main(string[] args) 
    { 
     MyEnum me = MyEnum.MY_VALUE; 
     Console.WriteLine(me + " = " + me.GetChar()); 
    } 
} 
+1

Tout ce dont vous avez besoin est '(char) e'. [Vous encourez une pénalité de boxe en allant pour 'enum.GetHashCode'.] (Http://stackoverflow.com/questions/7995606/boxing-occurrence-in-c-sharp) En outre,' GetHashCode' est simplement un détail d'implémentation . – nawfal

0
char charPC = 'P'; 
if (Enum.IsDefined(typeof(PayCode), (PayCode)charPC)) { 
     // check if charPC is a valid value 
     PayCode enumPC = (PayCode)charPC; // enumPC == PayCode.Paid 
} 
  • fait un petit changement, pas besoin de le convertir en un (int) dans la si pour tous les cas, dépend du type enum. Mais si vous le lancez directement sur le type enum lui-même, cela devrait toujours fonctionner.
Questions connexes