c# - tipos - Cadenas y entradas, implícitas y explícitas
tipos de datos en c# pdf (5)
Los operadores binarios + están predefinidos para los tipos numéricos y de cadena. Para los tipos numéricos, + calcula la suma de sus dos operandos. Cuando uno o ambos operandos son de tipo cadena, + concatena las representaciones de cadena de los operandos.
El operador de asignación (=) almacena el valor de su operando de la mano derecha en la ubicación de almacenamiento, propiedad o indizador denotado por su operando de la izquierda y devuelve el valor como resultado. Los operandos deben ser del mismo tipo (o el operando de la derecha debe ser implícitamente convertible al tipo del operando de la izquierda).
Tenía un compañero de trabajo que me preguntara esto, y en mi cerebro desconcertado, no tenía una respuesta:
¿Por qué es eso lo que puedes hacer?
string ham = "ham " + 4;
Pero no:
string ham = 4;
Si hay una conversión / operación implícita para la conversión de cadenas cuando se está concatenando , ¿por qué no lo mismo cuando se lo asigna como una cadena? (Sin sobrecargar al operador, por supuesto)
El valor del lado derecho de la primera expresión es una cadena, mientras que el valor del lado derecho de la segunda expresión no lo es. La concatonación está proporcionando la magia en el primer escenario, donde la asignación no está haciendo nada especial. En el segundo escenario, la tarea sigue siendo tonta.
La expresion
"ham " + 4
Fuerza una conversión implícita de 4 a una cadena basada en la combinación de un tipo de cadena y el operador de suma. Específicamente es una cualidad del operador "+", y cuando se realiza una sobrecarga del operador, puede implementar manualmente el mismo tipo de cosas.
Un ejemplo similar y menos obvio sería:
long myNumber = Int64.MaxValue - 1;
En este caso, "1" debe evaluarse como un entero de 32 bits pero se convierte implícitamente. Puede consultar la sección de especificaciones del lenguaje C # 6.1 para obtener una lista exhaustiva de conversiones implícitas admitidas por el compilador.
editar: para ser claros, la sección de especificaciones de lenguaje a la que me he referido enumera conversiones implícitas admitidas por el compilador, mientras que los operadores como "+" pueden tener sus propias conversiones compatibles.
No hay una conversión implícita al hacer la concatenación. La concatenación de cadenas se resuelve en una llamada String.Concat, que tiene una sobrecarga que toma Objects. Es esta sobrecarga la que realiza una conversión (explícita) a una cadena.
Al concatenar el compilador, convierte la instrucción "ham" + 4
en una llamada a String.Concat
, que toma dos parámetros de object
, por lo que el valor 4
se ToString
recuadro y luego se llama a ToString
sobre eso.
Para la asignación no hay conversión implícita de int
a string
, y por lo tanto no puede asignar 4
a una string
sin convertirla explícitamente.
En otras palabras, el compilador maneja las dos asignaciones de forma muy diferente, a pesar de que se ven muy similares en C #.