2009-02-21 21 views
40

Quiero saber por qué no podemos tener "char" como tipo de enumeración subyacente. Como tenemos byte, sbyte, int, uint, long, ulong, short, ushort como subyacente tipo enum. Segundo, ¿cuál es el tipo subyacente predeterminado de una enumeración?Por qué no podemos tener "enum" enum tipo

Respuesta

15

El tipo predeterminado es int. Más información en C# reference en MSDN. También puede encontrar un enlace al C# language specification en MSDN. Creo que la razón de la restricción probablemente se deriva de estas declaraciones en la especificación del lenguaje, sección 4.1.5.

El tipo char se clasifica como un tipo integral , pero se diferencia de los otros tipos integrales de dos maneras:

• No hay conversiones implícitas de otros tipos al tipo char. En particular, incluso aunque el sbyte, byte, y los tipos USHORT tienen rangos de valores que son completamente representable utilizando el tipo char, implícitas conversiones de sbyte, byte, o ushort a CHAR no existe.

• Constantes del tipo char debe escribe como caracteres literales o como enteros literales, en combinación con un elenco de tipo char. Por ejemplo, (char) 10 es lo mismo que '\ x000A'.

-4

Enumeradores de caracteres simplemente serían cadenas ¿no? No estoy seguro de qué otro beneficio obtendrías de una enumeración de caracteres?

Como han dicho otros, el tipo predeterminado es int para una enumeración.

+2

Es útil al convertir desde una columna de base de datos que es un NCHAR (0001) y la enumeración. Específicamente, es útil tener algo que tenga sentido cuando se lo mire en una selección, pero se limita a un conjunto específico de valores. Como un ejemplo: estado. Pendiente: 'P', En curso: 'I', Completado con éxito: 'S', Fallido: 'F'. –

+0

Apoyo el comentario de la base de datos ya que eso es exactamente lo que me llevó a esta pregunta. – Nathan

3

Técnicamente, no puedes hacer esto. Pero, puedes convertir la enumeración en un byte y luego convertir eso en char. Esto es útil si su objetivo es tener algo como esto (darse cuenta de que esto es imposible de hacer:

public enum CharEnum 
{ 
    one = '1' 
} 

Usted puede hacer esto, sin embargo, mediante el uso de valores de bytes ASCII y luego convertir:

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

A continuación, puede convertir a byte y a char para obtener el valor de char. No es realmente bonito, pero funcionará, si obtener un char es su objetivo final. También puede usar unicode y un valor int, si necesita caracteres externos del rango ASCII. :-)

13

Esto es una solución Estoy usando

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

O simplemente podría escribir '(char) e' sin el' GetHashCode() '. –

+4

Todo lo que necesitas es '(char) e'. [Estás incurriendo en una penalización de boxeo yendo por 'enum.GetHashCode'.] (Http://stackoverflow.com/questions/7995606/boxing-occurrence-in-c-sharp) – nawfal

76

Sé que esto es una cuestión mayor, pero esta información habría sido útil para mí:

Parece que no hay ningún problema usando char como tipo de valor para las enumeraciones en C# .NET 4.0 (posiblemente incluso 3.5, pero no he probado esto).Esto es lo que he hecho, y funciona por completo:

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

Convertir Enum a char:

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

carbón Convertir a 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 
} 

funciona de maravilla, al igual que lo esperarías del tipo de char!

+8

has votado tu respuesta, pero ten en cuenta que la enumeración en respuesta todavía tiene 'int' como el tipo subyacente. El compilador lo trata como 'int'. Wished C# no tenía este caso extremo. – nawfal

-1

Casi todo se ha dicho ya sobre eso. Sólo quería decir que puede utilizar extensiones si se utiliza una gran cantidad de "enumeraciones char":

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

Todo lo que necesitas es '(char) e'. [Estás incurriendo en penalización de boxeo yendo por 'enum.GetHashCode'.] (Http://stackoverflow.com/questions/7995606/boxing-occurrence-in-c-sharp) Además,' GetHashCode' es simplemente un detalle de implementación . – 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 
} 
  • hizo un pequeño cambio, no hay necesidad de convertirlo en un (int) en el si para todos los casos, depende del tipo enum. Pero si lo lanzas directamente al tipo enum, debería funcionar siempre.
Cuestiones relacionadas