Cuerdas y enteros, implícitos y explícitos
Pregunta
Tenía un compañero de trabajo me pregunta esto, y en mi estado del cerebro confundido yo no tenía una respuesta:
¿Por qué es que usted puede hacer:
string ham = "ham " + 4;
Pero no:
string ham = 4;
Si hay un fundido / operación implícita para la conversión de cadenas cuando se está concatenación , ¿por qué no es lo mismo cuando asignación como una cadena? (Sin hacer un poco de sobrecarga de operadores, por supuesto)
Solución
Al concatenar el compilador convierte la declaración "ham" + 4
en una llamada a String.Concat
, que toma object
dos parámetros, por lo que el valor 4
es en caja y luego ToString
se llama en eso.
Para la asignación no hay conversión implícita de int
a string
, y por lo tanto no se puede asignar a un <=> <=> sin convertir explícitamente.
En otras palabras, las dos tareas se manejan de manera muy diferente por el compilador, a pesar de que tienen un aspecto muy similar en C #.
Otros consejos
Los operadores binarios + están predefinidos para tipos numéricos y de cadena. para numérica tipos, + calcula la suma de sus dos operandos. Cuando uno o ambos operandos son de tipo cadena, + concatena el representaciones de cadena de la operandos.
El operador de asignación (=) almacena la valor de su operando de la derecha en el ubicación de almacenamiento, propiedad o indexador denotado por el operando de la izquierda y devuelve el valor como resultado. los operandos deben ser del mismo tipo (o el operador de la derecha debe ser convertir implícitamente al tipo de el operando de la izquierda).
No hay conversión implícita al hacer concatenación. La concatenación de cadenas se resuelve a una llamada String.Concat, que tiene una sobrecarga que toma objetos. Es esta sobrecarga que lleva a cabo una conversión (explícito) de cadena.
El valor del lado derecho de la primera expresión es una cadena, mientras que el valor de la parte derecha de la segunda expresión no es. El concatonation está proporcionando la magia en el primer escenario, donde la asignación no está haciendo nada especial. En el segundo escenario, la asignación continúa el tonto.
La expresión
"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. En concreto se trata de una calidad de operador "+", y cuando se hace la sobrecarga de operadores se puede aplicar manualmente el mismo tipo de cosas.
Un ejemplo similar y menos obvia sería:
largo myNumber = Int64.MaxValue - 1;
En este caso "1" debe ser evaluado como un entero de 32 bits, pero se convierte implícitamente. Usted puede consultar la sección de especificaciones lenguaje C # 6.1 para una lista exhaustiva de las conversiones implícitas soportados por el compilador.
editar:. Para ser claro, la sección de especificaciones lenguaje I mencionadas listas conversiones implícitas soportados por el compilador, mientras que los operadores como "+" puede tener sus propias conversiones soportadas