string = string + int: O que há por trás das cenas?

Em C # você pode implicitamente concatenar uma string e digamos, um inteiro:

string sth = "something" + 0; 

Minhas perguntas são:

  1. Por que, ao assumir o fato de que você pode implicitamente concatenar uma string e um int, o C # não permite a boot de strings como esta:

     string sth = 0; // Error: Cannot convert source type 'int' to target type 'string' 
  2. Como C # lança 0 como string. É 0.ToString() ou (string)0 ou alguma outra coisa?

  3. Como encontrar uma resposta da pergunta anterior?

Compila para uma chamada para String.Concat(object, object) , assim:

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

(Note que esta linha em particular será realmente otimizada pelo compilador)

Esse método é definido da seguinte maneira: (retirado da fonte de referência .Net)

  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()); } 

(Isso chama String.Concat(string, string) )


Para descobrir isso, você pode usar ildasm , ou Reflector (em IL ou em C # sem otimizações) para ver o que a linha + compila para.

Isso é especificado na seção 7.8.4 da especificação do C # 4:

Para uma operação da forma x + y , a resolução de sobrecarga do operador binário (§7.3.4) é aplicada para selecionar uma implementação de operador específica. Os operandos são convertidos nos tipos de parâmetros do operador selecionado e o tipo do resultado é o tipo de retorno do operador.

Os operadores de adição predefinidos estão listados abaixo. Para tipos numéricos e de enumeração, os operadores de adição predefinidos calculam a sum dos dois operandos. Quando um ou ambos os operandos são do tipo string, os operadores de adição predefinidos concatenam a representação de string dos operandos.

A última sentença é a mais relevante para essa situação.

Então depois:

Concatenação de cordas

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

Essas sobrecargas do operador binário + executam a concatenação de strings. Se um operando de concatenação de cadeia for nulo, uma cadeia vazia será substituída. Caso contrário, qualquer argumento não string será convertido em sua representação de string invocando o método ToString virtual herdado do object type. Se ToString retornar null, uma string vazia será substituída.

Isso especifica como o inteiro é convertido em uma string.

E o resultado:

O resultado do operador de concatenação de strings é uma string que consiste nos caracteres do operando esquerdo, seguidos pelos caracteres do operando à direita. O operador de concatenação de cadeia nunca retorna um valor nulo.

O meio real de executar a concatenação é específico da implementação, mas, conforme observado em outras respostas, a implementação do MS usa string.Concat .