Strings e ints, implícitos e explícitos
Pergunta
tinha um colega de trabalho me perguntam isso, e no meu cérebro confuso estado que eu não tenho uma resposta:
Por que é que você pode fazer:
string ham = "ham " + 4;
Mas não:
string ham = 4;
Se há um elenco / operação implícita para conversão de cadeia quando você estiver concatenação , por que não o mesmo quando atribuição -lo como uma string? (Sem fazer alguma sobrecarga de operadores, é claro)
Solução
Quando concatenando o compilador transforma o "ham" + 4
declaração em uma chamada para String.Concat
, que tem dois parâmetros object
, de modo que o 4
valor é embalado e ToString
então é chamado sobre isso.
Para a atribuição não há nenhuma conversão implícita de int
para string
, e, portanto, você não pode 4
atribuir a um string
sem convertê-lo explicitamente.
Em outras palavras, os dois trabalhos são tratados de forma muito diferente pelo compilador, apesar do fato de que eles são muito semelhantes em C #.
Outras dicas
operadores binários + são predefinidos para numérica e de string tipos. para numérico tipos, + calcula a soma dos seus dois operandos. Quando um ou ambos os operandos são do tipo string, + concatena o representações de seqüência do operandos.
O operador de atribuição (=) armazena os valor do seu operando à direita na local de armazenamento, propriedade ou indexador denotado por sua mão esquerda operando e retorna o valor como seu resultado. o operandos deve ser do mesmo tipo (ou o operando à direita deve ser implicitamente conversível para o tipo de o operando do lado esquerdo).
Não há nenhuma conversão implícita ao fazer concatenação. Concatenação de String resolve para baixo para uma chamada String.Concat, que tem uma sobrecarga que leva Objects. É essa sobrecarga que executa uma conversão (explícita) para string.
O valor do lado direito da primeira expressão é uma string, enquanto o valor do lado direito da segunda expressão não é. O concatonation está fornecendo a magia no primeiro cenário, onde a atribuição não está fazendo nada de especial. No segundo cenário, a tarefa continua a desempenhar mudo.
A expressão
"ham " + 4
Força uma conversão implícita de 4 para uma cadeia com base na combinação de um tipo de cadeia e o operador de adição. Especificamente, é uma qualidade do operador "+", e ao fazer sobrecarga de operador é possível implementar manualmente o mesmo tipo de coisa.
Um exemplo semelhante e menos óbvia seria:
longa myNumber = Int64.MaxValue - 1;
Neste caso, "1" deve ser avaliada como um inteiro de 32 bits, mas ele é convertido implicitamente. Você pode verificar o C # secção linguística especificação 6.1 para uma lista exaustiva de conversões implícitas suportados pelo compilador.
edit:. Para ser claro, a seção linguagem especificação i referida lista as conversões implícitas suportados pelo compilador, enquanto os operadores como "+" podem ter suas próprias conversões suportadas