Domanda

Aveva un collega mi chieda questo, e nel mio cervello confuso stato non ho avuto una risposta:

Perché è che si può fare:

string ham = "ham " + 4;

Ma non:

string ham = 4;

Se c'è un cast / un'operazione implicita per la conversione stringa quando si è concatenamento , perché non lo stesso quando assegnazione come una stringa? (Senza fare un po 'di overloading degli operatori, ovviamente)

È stato utile?

Soluzione

Quando concatenando il compilatore trasforma l'istruzione "ham" + 4 in una chiamata a String.Concat, che richiede due object parametri, in modo che il valore 4 è inscatolato e quindi ToString viene chiamato su questo.

Per l'assegnazione non v'è alcuna conversione implicita da int a string, e quindi non è possibile assegnare ad un <=> <=> senza convertirlo esplicitamente.

In altre parole le due assegnazioni vengono gestiti in modo molto diverso dal compilatore, nonostante il fatto che hanno un aspetto molto simile a C #.

Altri suggerimenti

  

operatori + binari sono predefiniti per   tipi numerici e di stringhe. per numerico   tipi, + calcola la somma dei suoi due   operandi. Quando uno o entrambi gli operandi   sono di tipo stringa, + concatena il   rappresentazioni di stringa del   operandi.

Riferimento

  

L'operatore di assegnazione (=) memorizza la   il valore del suo operando a destra nella   posizione di memorizzazione, la proprietà o indicizzatore   indicato con il suo operando di sinistra e   restituisce il valore come risultato. Il   operandi devono essere dello stesso tipo (o   l'operando di destra deve essere   conversione implicita nel tipo di   l'operando a sinistra).

Riferimento

Non v'è alcuna conversione implicita quando si fa la concatenazione. Stringa concatenazione risolve giù per una chiamata String.Concat, che ha un sovraccarico che prende oggetti. E 'questo sovraccarico che esegue una conversione (esplicito) a stringa.

Il valore del lato destro della prima espressione è una stringa, mentre il valore del lato destro della seconda espressione non è. Il concatonation sta fornendo la magia nel primo scenario, in cui l'assegnazione non sta facendo nulla di speciale. Nel secondo scenario, l'assegnazione continua a fare il finto tonto.

L'espressione

"ham " + 4 

Forza una conversione implicita di 4 in una stringa basata sulla combinazione di un tipo stringa e l'operatore di addizione. Nello specifico si tratta di una qualità del l'operatore "+", e quando si fa l'overloading degli operatori è possibile implementare manualmente lo stesso tipo di cosa.

Un esempio simile e meno ovvia sarebbe:

lungo myNumber = Int64.MaxValue - 1;

In questo caso "1" deve essere valutato come un intero a 32 bit, ma viene implicitamente convertito. È possibile controllare la lingua # sezione spec C 6.1 per un elenco esaustivo delle conversioni implicite supportati dal compilatore.

modifica:. Per essere chiari, la sezione linguistica spec ho fatto riferimento alle liste di conversioni implicite supportati dal compilatore, mentre gli operatori come "+" può avere le proprie conversioni supportate

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top