Stringhe e int, implicite ed esplicite
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)
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.
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).
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