2009-02-05 21 views
9

tenía un compañero de trabajo me pregunte esto, y en mi estado del cerebro confundido yo no tenía una respuesta:Cuerdas y enteros, implícitos y explícitos

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á concatenando, ¿por qué no es lo mismo cuando Assig ning como una cadena? (Sin sobrecargar al operador, por supuesto)

Respuesta

19

Al concatenar el compilador convierte la declaración "ham" + 4 en una llamada a String.Concat, que toma dos parámetros object, 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 4string sin convertir explícitamente.

En otras palabras, las dos asignaciones son manejadas de forma muy diferente por el compilador, a pesar de que se ven muy similares en C#.

+0

Efectivamente es cierto, pero no sé que en realidad se llama al método de concatenación o genera código equivalente. La referencia parece indicar lo último. – tvanfosson

+0

Si observa el código del modo de lanzamiento con Reflector (configúrelo para mostrar IL), verá que llama a Concat. –

+0

Finalmente, ahora tiene sentido por qué a menudo no veo las llamadas ToString() en la afeitadora. Seguí pensando que era una convención especial del código de afeitar. – BVernon

0

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

2

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.

0

La expresión

"ham " + 4 

Obliga 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 obvia sería:

largo 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 refería enumera las conversiones implícitas admitidas por el compilador, mientras que operadores como "+" pueden tener sus propias conversiones compatibles.

+0

No hay conversión implícita de int en cadena. – jalf

+0

Eso es correcto. Hay una conversión implícita vinculada al operador "+". –

+1

El operador + no está definido para Cadena. El compilador genera las llamadas correspondientes a Concat en su lugar. –

4

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 del tipo cadena, + concatena las representaciones de cadena de los operandos .

Reference

El operador de asignación (=) almacena el valor de su operando de la derecha en el ubicación de almacenamiento, la propiedad o indizador denotado por su operando y rendimientos de la mano izquierda el valor como resultado. Los operandos deben ser del mismo tipo (o el operando de la derecha debe ser implícitamente convertible al tipo de el operando de la izquierda).

Reference

Cuestiones relacionadas