c# - switch - Por qué no podemos tener tipos de enum "char"
enum to list c# (7)
Quiero saber por qué no podemos tener "char" como tipo de enume subyacente. Como tenemos byte, sbyte, int, uint, long, ulong, short, ushort como tipo de enumeración subyacente. Segundo, ¿cuál es el tipo subyacente predeterminado de una enumeración?
El tipo predeterminado es int. Más información en la referencia de C # en MSDN. También puede encontrar un enlace a la especificación de lenguaje C # 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 de caracteres se clasifica como un tipo integral, pero difiere de los otros tipos integrales de dos maneras:
• No hay conversiones implícitas de otros tipos al tipo de char. En particular, aunque los tipos sbyte, byte y ushort tienen rangos de valores que son completamente representables utilizando el tipo de caracteres, las conversiones implícitas de sbyte, byte o ushort to char no existen.
• Las constantes del tipo char deben escribirse como literales de caracteres o como literales enteros en combinación con un molde para escribir char. Por ejemplo, (char) 10 es lo mismo que ''/ x000A''.
Las enumeraciones 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.
Esta es la solución que 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''
}
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''
}
Sin embargo, puede hacerlo utilizando valores de bytes ASCII y luego convirtiendo:
public enum CharEnum
{
one = 49,
two = 50
}
Luego puede convertir a byte y a char para obtener el valor de char. No es realmente bonito, pero funcionará, si conseguir un char es tu objetivo final. También puede usar unicode y un valor int, si necesita caracteres fuera del rango ASCII. :-)
Sé que esta es una pregunta anterior, pero esta información me habría sido útil:
Parece que no hay problema al usar char como el tipo de valor para enumeraciones en C # .NET 4.0 (posiblemente incluso 3.5, pero no lo he probado). Esto es lo que hice, y funciona completamente:
public enum PayCode {
NotPaid = ''N'',
Paid = ''P''
}
Convierta Enum en char:
PayCode enumPC = PayCode.NotPaid;
char charPC = (char)enumPC; // charPC == ''N''
Convierte char 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 como un amuleto, como cabría esperar del tipo de char!
Casi todo ya se ha dicho sobre eso. Solo quería decir que puede usar extensiones si usa muchas "char enumeraciones":
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());
}
}
char charPC = ''P'';
if (Enum.IsDefined(typeof(PayCode), (PayCode)charPC)) {
// check if charPC is a valid value
PayCode enumPC = (PayCode)charPC; // enumPC == PayCode.Paid
}
- Se realizó un pequeño cambio, sin necesidad de convertirlo a un ( int ) en el caso de si, para todos los casos, depende del tipo de enumeración. Pero si lo lanzas directamente al tipo enum, debería funcionar siempre.