Je veux savoir pourquoi nous ne pouvons pas avoir "char" comme type enum sous-jacent. Comme nous avons octet, sbyte, int, uint, long, ulong, court, ushort comme sous-type enum type. Deuxièmement quel est le type sous-jacent par défaut d'une énumération?Pourquoi nous ne pouvons pas avoir de type "char" enum
Répondre
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'.
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.
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. :-)
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'
}
Ou vous pouvez simplement écrire '(char) e' sans' GetHashCode() '. –
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
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!
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
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());
}
}
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
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.
- 1. Si les types de base sont des objets, pourquoi ne pouvons-nous pas le faire?
- 2. pouvons-nous renommer nos dossiers Rails et ne pas avoir d'effets secondaires?
- 3. Pouvons-nous avoir un tableau de modules personnalisés?
- 4. Si nous ne pouvons pas lier une commande de MouseBinding, que devons-nous faire?
- 5. Pouvons-nous avoir un texte non éditable dans edittext
- 6. Pourquoi ne pouvons-nous pas changer l'état de l'appartement d'un thread ThreadPool et pourquoi n'avons-nous pas besoin d'un messagepump quand ShowDialog est utilisé?
- 7. pouvons-nous verrouiller un répertoire?
- 8. Pourquoi ne pouvons-nous pas déclarer var a = new Liste <string> au niveau de la classe?
- 9. Pouvons-nous tirer parti du système de type pour sécuriser les programmes?
- 10. Pouvons-nous avoir une seule instance de portlet sur plusieurs pages dans liferay?
- 11. Ne pouvons-nous pas exécuter BTSHTTPReceive.dll dans Win XP (IIS 5)
- 12. Qu'est-ce qu'un script PowerShell peut faire et ce que nous ne pouvons pas faire avec?
- 13. Pourquoi C# ne définit-il pas une opération d'addition pour char?
- 14. Pouvons-nous modifier les claviers par programme?
- 15. Comment pouvons-nous initialiser la structure?
- 16. Que pouvons-nous faire avec telnet?
- 17. Comment pouvons-nous utiliser MSHTML avec VBA?
- 18. pouvons-nous installer sqlserver2005 avant d'installer vs2005?
- 19. Pouvons-nous penser que le mapping de type imbriqué est une composition?
- 20. Ok, nous pouvons avoir des identifiants privés en javascript, mais qu'en est-il des protégés?
- 21. Pourquoi suis-je capable de lire char [2] mais pas char [1]?
- 22. Ne pas avoir de valeur en javascript
- 23. Comment pouvons-nous définir le bouton de sortie de JFileChooser?
- 24. Pourquoi Haskell interprète-t-il mon type Num comme Enum?
- 25. Pourquoi j'obtiens l'erreur "type has no typeinfo" avec un type enum
- 26. pouvons-nous exécuter javascript dans l'application de la fenêtre .net
- 27. comment pouvons-nous activer le tactile pour une vue caméra?
- 28. Pourquoi les temporaires de fonction membre ne sont-ils pas liés au bon type?
- 29. Pourquoi avons-nous besoin de l'interrogation Comet ou HTTP lorsque nous n'utilisons pas de navigateur?
- 30. Blackberry - pouvons-nous changer de thème en utilisant notre application?
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'. –
Je seconde le commentaire de la base de données car c'est exactement ce qui m'a conduit à cette question. – Nathan