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)

Foi útil?

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.

Referência

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

Referência

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top