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)

¿Fue útil?

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.

Referencia

  

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).

Referencia

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top