string = string + int: ¿Qué hay detrás de las escenas?

En C #, puede concatenar implícitamente una cadena y, digamos, un entero:

string sth = "something" + 0; 

Mis preguntas son:

  1. Por qué, al suponer el hecho de que puede concatenar implícitamente una cadena y un int, C # no permite inicializar cadenas como esta:

     string sth = 0; // Error: Cannot convert source type 'int' to target type 'string' 
  2. Cómo C # arroja 0 como cadena. ¿Es 0.ToString() o (string)0 o algo más?

  3. ¿Cómo encontrar una respuesta a la pregunta anterior?

Se comstack a una llamada a String.Concat(object, object) , de esta manera:

 string sth = String.Concat("something", 0); 

(Tenga en cuenta que esta línea en particular será optimizada por el comstackdor)

Este método se define de la siguiente manera: (Tomado de .Net Reference Source)

  public static String Concat(Object arg0, Object arg1) { if (arg0==null) { arg0 = String.Empty; } if (arg1==null) { arg1 = String.Empty; } return Concat(arg0.ToString(), arg1.ToString()); } 

(Esto llama String.Concat(string, string) )


Para descubrir esto, puede usar ildasm o Reflector (en IL o en C # sin optimizaciones) para ver a qué se ildasm la línea + .

Esto se especifica en la sección 7.8.4 de la especificación C # 4:

Para una operación de la forma x + y , se aplica la resolución de sobrecarga del operador binario (§7.3.4) para seleccionar una implementación de operador específica. Los operandos se convierten a los tipos de parámetros del operador seleccionado, y el tipo de resultado es el tipo de retorno del operador.

Los operadores de adición predefinidos se enumeran a continuación. Para los tipos numéricos y de enumeración, los operadores de sum predefinidos calculan la sum de los dos operandos. Cuando uno o ambos operandos son de tipo cadena, los operadores de adición predefinidos concatenan la representación de cadena de los operandos.

La última oración es la más relevante para esta situación.

Entonces despúes:

Concatenación de cadenas

 string operator +(string x, string y); string operator +(string x, object y); string operator +(object x, string y); 

Estas sobrecargas del operador binario + realizan una concatenación de cadenas. Si un operando de concatenación de cadenas es nulo, se sustituye una cadena vacía. De lo contrario, cualquier argumento que no sea cadena se convierte a su representación de cadena invocando el método virtual ToString heredado de tipo objeto. Si ToString devuelve null, se sustituye una cadena vacía.

Eso especifica cómo el entero se convierte en una cadena.

Y el resultado:

El resultado del operador de concatenación de cadenas es una cadena que consta de los caracteres del operando izquierdo seguidos de los caracteres del operando derecho. El operador de concatenación de cadenas nunca devuelve un valor nulo.

Los medios reales para realizar la concatenación son específicos de la implementación, pero como se señala en otras respuestas, la implementación de MS usa string.Concat .