2011-08-05 14 views
9

De acuerdo con msdn Las enumeraciones no pueden tener un tipo base de char. ¿Por qué las enumeraciones no tienen un tipo base de char? Además, ¿por qué Microsoft recomienda encarecidamente que una enumeración contenga una constante con un valor de 0? Muchas gracias.NET Tipo de base Enum de Char

Respuesta

5

puede encontrar un enlace al C# language specification. 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 entero, pero se diferencia de los otros tipos integrales de dos maneras:

  • No hay conversiones implícitas de otros tipos al tipo 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'.

En cuanto a la razón por cero, debido a que el valor por defecto de un sin inicializar enum es 0.

+0

+1, aunque la página que enlaza no es la especificación del lenguaje C#;) –

+0

@Thomas: oops - déjame arreglar eso –

+0

¡Guau! Buen hallazgo – gh9

-1

¿Por qué enum no tiene un tipo base de char?

Sugeriría que esto se debe a la forma en que .NET maneja Chars como unicode, lo que significa que un Char! = Byte (su valor puede ser mayor que 255). Enum no puede basarse en un tipo booleano tampoco y también es un tipo integral. También usar un Char como el tipo de base no duplicaría un tipo de base existente así que no tiene sentido hacerlo.

¿Por qué Microsoft recomienda encarecidamente que una enumeración contenga una constante con un valor de 0?

La razón por la que se recomienda tener siempre un valor igual a 0 se debe a una enumeración es un tipo de valor y cuando se hace uno nuevo que tendrá el valor de 0.

+1

No estoy seguro que 255 tiene que ver con nada. El respaldo predeterminado de una enumeración es un int, después de todo. (no mi downvote *) –

+0

enumeraciones puede tener un tipo de datos DOBLE que es de 16 bits al igual que un CHAR es. Entonces, si un ENUM puede tomar un doble no hay realmente una razón por la que no pueda tomar un CHAR. – gh9

+0

Gracias por explicar sobre el valor 0, no lo pensé de esa manera. – gh9

2

Por qué puede enumeraciones no tiene un tipo de base de carbón?

Porque realmente no tiene sentido (de la misma manera que tener un tipo base de flotador no tiene sentido). Debajo de las cubiertas, una enumeración es un número entero, sin embargo, como un carácter de caracteres puede ser cualquier carácter Unicode, no hay realmente un mapeo estudiable de caracteres a enteros.

¿Por qué Microsoft recomienda encarecidamente que una enumeración contenga una constante con un valor de 0?

Debido a que el valor predeterminado de una enumeración no-inicializado es cero (ver Enums should have zero value)

+0

@Anthony Mi punto es que puedes convertir un byte en un número entero. – Justin

+0

@downvoter ¿Qué pasa con esta respuesta? – Justin

+0

No he votado negativamente, pero aquí hay un voto positivo. –

3

Aunque como hemos visto aquí, que está específicamente no permite definir una enumeración carácter porque no hay una conversión implícita de char a cualquier otro tipo integral, hay una conversión integral de carbón a un entero, por lo que se puede hacer esto:

public enum MyCharEnum 
{ 
    BEL = 0x07, 
    CR = 0x0D, 
    A = 'A', 
    z = 'z' 
} 

Y el uso de una conversión explícita a char, por lo tanto:

MyCharEnum thing = MyCharEnum.BEL; 
char ch = (char)thing; 
System.Console.WriteLine(ch.ToString()); 

(y, sí, hace un pitido - al igual que los buenos viejos días!)