ACTUALIZACIÓN: Estoy usando esta pregunta como tema de mi blog hoy. Gracias por la gran pregunta. Por favor, vea el blog para futuras adiciones, actualizaciones, comentarios, etc.
http://blogs.msdn.com/ericlippert/archive/2009/10/01/why-does-char-convert-implicitly-to-ushort-but-not-vice-versa.aspx
No está del todo claro para mí qué es exactamente lo que está pidiendo. Las preguntas "por qué" son difíciles de responder. Pero voy a intentarlo.
Primero, código que tiene una conversión implícita de char a int (nota: esto no es un "molde implícito", esto es una "conversión implícita") es legal porque la especificación C# establece claramente que hay una conversión implícita de char a int, y el compilador es, a este respecto, una implementación correcta de la especificación.
Ahora, puede señalar sensiblemente que la pregunta se ha rogado por completo. ¿Por qué hay una conversión implícita de char a int? ¿Por qué los diseñadores del lenguaje creen que esta es una regla sensata para agregar al lenguaje?
Bueno, antes que nada, las cosas obvias que previenen que sean una norma del lenguaje no se aplican. Un char se implementa como un entero de 16 bits sin signo que representa un carácter en una codificación UTF-16, por lo que se puede convertir a un ushort sin pérdida de precisión o, para el caso, sin cambio de representación. El tiempo de ejecución simplemente pasa de tratar este patrón de bits como un char a tratar el mismo patrón de bits como un ushort.
Es por lo tanto posible para permitir una conversión de char a ushort. Ahora, solo porque algo sea posible no significa que sea una buena idea. Claramente, los diseñadores del lenguaje pensaron que convertir implícitamente char a ushort era una buena idea, pero convertir implícitamente ushort a char no lo es. (Y como char para ushort es una buena idea, parece razonable que char-to-anything-that-ushort-goes-to también sea razonable, por lo tanto, char to int. Además, espero que esté claro por qué se permite explícitamente fundición de ushort a char es sensible, su pregunta es acerca de las conversiones implícitas)
Así que en realidad tienen dos preguntas relacionadas aquí: en primer lugar, ¿por qué es una mala idea permitir que las conversiones implícitas de ushort/corto/bytes/sbyte. ¿char? y segundo, ¿por qué es una buena idea permitir conversiones implícitas de char a ushort?
A diferencia de usted, tengo las notas originales del equipo de diseño de idiomas a mi disposición. A través de ellos, descubrimos algunos hechos interesantes.
La primera pregunta se trata en las notas del 14 de abril de 1999, donde surge la cuestión de si debería ser legal convertir de byte a char. En la versión original previa a la publicación de C#, esto fue legal por un breve tiempo. He editado ligeramente las notas para que sean claras sin una comprensión de los nombres en código de Microsoft previos a la versión de 1999. También he añadido énfasis en los puntos importantes:
[El comité de diseño de lenguajes] ha elegido para proporcionar una conversión implícita de bytes a caracteres, ya que el dominio de uno es completamente contenida por el otro. En este momento, sin embargo, [la biblioteca de ejecución ] sólo proporcionan métodos de escritura que tienen caracteres y enteros, lo que significa que los bytes copia impresa como caracteres ya que termina siendo el mejor método . Podemos resolver esto ya sea por proporcionando más métodos en la clase Writer o eliminando la conversión implícita .
Existe un argumento para explicar por qué el último es lo correcto. Después de todo, bytes realmente no son caracteres. Es verdad que puede ser un mapeo útil de bytes a caracteres, pero en última instancia, 23 no denota la mismo que el personaje con ascii valor de 23, de la misma manera que 23B denota lo mismo que 23L. Pidiendo [los autores de la biblioteca] para proporcionar este método adicional simplemente porque cómo funciona una peculiaridad en nuestro sistema de tipo parece bastante débil. Entonces, me gustaría sugieren que hagamos la conversión explícita de byte a char.
Las notas concluyen con la decisión de que byte-to-char debe ser una conversión explícita, y entero-literal-in-range-of-char también debe ser una conversión explícita.
Tenga en cuenta que las notas de diseño de idioma no indican por qué ushort-to-char también se volvió ilegal al mismo tiempo, pero puede ver que se aplica la misma lógica.Cuando se llama a un método sobrecargado como M (int) y M (char), cuando le pasa un ushort, es bueno que quiera tratar el ushort como un número, no como un personaje. Y un ushort no es una representación de caracteres de la misma manera que un ushort es una representación numérica, por lo que parece razonable hacer que esa conversión también sea ilegal.
La decisión de hacer que el carbón vaya a ushort se hizo el 17 de septiembre de 1999; las notas de diseño de ese día sobre este tema simplemente afirman "char to ushort también es una conversión legal implícita", y eso es todo. Ninguna otra exposición de lo que estaba sucediendo en las cabezas del diseñador del lenguaje ese día es evidente en las notas.
Sin embargo, podemos hacer conjeturas informadas sobre por qué implicit char-to-ushort se consideró una buena idea. La idea clave aquí es que la conversión de número a personaje es una conversión "posiblemente dudosa". Es tomar algo que NO SABES tiene la intención de ser un personaje y elegir tratarlo como tal. Parece el tipo de cosa que desea llamar que está haciendo explícitamente, en lugar de permitirlo accidentalmente. Pero el reverso es mucho menos fiable. Existe una larga tradición en la programación C de tratar caracteres como enteros: para obtener sus valores subyacentes o para hacer matemáticas sobre ellos.
En resumen: parece razonable que usar un número como personaje podría ser un accidente y un error, pero también parece razonable que el uso de un personaje como número sea deliberado y deseable. Esta asimetría se refleja, por lo tanto, en las reglas del lenguaje.
¿Eso responde su pregunta?
Esa es una muy buena pregunta. En C, un personaje es más o menos un sinónimo de un byte, ambos son tipos numéricos. Sin embargo, en C#, un personaje es un carácter unicode ... –
, entonces la respuesta sería porque el personaje es un carácter unicode por eso funciona en C#? – tintincutes
Solo para corregir el uso de la jerga, este no es un elenco implícito. Esta es una conversión implícita. "Casting" es el uso del operador de reparto; una conversión implícita es una conversión que NO requiere el operador de conversión. –