2012-05-02 15 views
9

Che cosa succede di seguito?Perché il numero intero viene convertito in stringa in questo caso?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

public class DotNetPad 
{ 
    public static void Main(string[] args) 
    { 
     int i = 10; 
     string k = "Test"; 
     Console.WriteLine(i+k); 
     Console.WriteLine(k+i); 
    } 
} 

i viene convertito in stringa in entrambi i casi. Mi sto confondendo con l'idea della precedenza degli operatori (sebbene questo esempio non mostri molto di ciò) e la direzione della valutazione. A volte la valutazione avviene da sinistra a destra o viceversa. Non conosco esattamente la scienza di come viene valutata l'espressione ...

Perché i viene convertito in stringa nell'esempio precedente e in realtà non genera un errore di compilazione?

risposta

23

Dalla C# spec - sezione operatore 7.7.4 Aggiunta:

concatenazione di stringhe:

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

L'operatore binario + esegue la concatenazione di stringhe quando uno o entrambi operandi sono di tipo stringa. Se un operando di concatenazione di stringhe è null, viene sostituita una stringa vuota. In caso contrario, qualsiasi argomento non stringa viene convertito nella sua rappresentazione stringa richiamando il metodo virtuale ToString ereditato dall'oggetto tipo. Se ToString restituisce null, viene sostituita una stringa vuota.

+2

Grazie - non è possibile ottenere rapidamente le specifiche :) –

8

In entrambi i casi, l'operatore + dispone della stringa come uno degli operandi. Non ci sono operatori sovraccarichi definiti dall'utente coinvolti, quindi il compilatore utilizzerà entrambi di di quelli come situazioni di concatenazione di stringhe.

Per quanto io sappia, il compilatore C# solo non utilizzerà concatenazione di stringhe per uno scenario di x + y dove siax o y è un string espressione al momento della compilazione se c'è un sovraccarico definito dall'utente, ad esempio, l'operatore XName operator +(XNamespace, string).

0

In realtà l'operatore "+" è per la concatenazione. La concatenazione tra int e string darà una stringa (con cast automatico int alla stringa)

+0

L'utilizzo di "+" tra le variabili numeriche in Console.WriteLine genererà una somma di quelle in variabili numeriche nell'output. – SoEnLion

18

Mi sto confondendo con l'idea della precedenza degli operatori e la direzione di valutazione.

No, non lo sei. Questo è spesso confuso, sì, ma non è la cosa che ti confonde perché né la precedenza né l'ordine di valutazione è rilevante alla domanda se il numero intero viene convertito in una stringa o perché è legale aggiungere un numero intero a una stringa.

Per prima unconfuse si sul punto si pretende di essere confuso in poi, le regole sono abbastanza semplici:

  • espressioni tra parentesi in base all'operatore priorità e l'associatività.
  • Le sottoespressioni
  • vengono valutate nell'ordine da sinistra a destra.

Questo è tutto ciò che serve sapere per farlo bene. Q Supponiamo che() restituisce un oggetto che ha un indicizzatore con un setter, e gli altri metodi di tutti i numeri interi di ritorno:

Q()[R()] = A() * B() + C()/D(); 

Questo è racchiusa tra parentesi in base alle priorità e l'associatività:

Q()[R()] = ((A() * B()) + (C()/D())); 

Ed ora ogni la sottoespressione viene valutata da sinistra a destra. Ogni sottoespressione, incluse le sottoespressioni che hanno esse stesse sottoespressioni. Quindi questo è equivalente al programma:

var q = Q(); 
var r = R(); 
var a = A(); 
var b = B(); 
var t1 = a * b; 
var c = C(); 
var d = D(); 
var t2 = c/d; 
var t3 = t1 + t2; 

e, infine, il setter indice su q si chiama con indice r e il valore di t3.

Si noti che ogni sottoespressione a sinistra viene valutata prima di ogni sottoespressione a destra. A() * B() è a sinistra di C()/D(), quindi succede prima.

Questo non ha assolutamente nulla a che fare con la tua domanda. La tua domanda si basa su un malinteso.

voglio sapere il motivo per cui i è convertito in stringa nell'esempio di cui sopra, e in realtà non dare un errore di compilazione

Ecco il tuo malinteso. i è non convertito in stringa. Viene convertito in object. Il vostro programma è esattamente equivalente a:

int i = 10; 
    string k = "Test"; 
    string t1 = System.String.Concat((object)i, (string)k); 
    Console.WriteLine(t1); 
    string t2 = System.String.Concat((string)k, (object)i); 
    Console.WriteLine(t2); 

Come si può vedere, non v'è alcuna conversione da i a stringa, in primo luogo. i viene convertito in oggetto tramite una conversione di boxing e quindi passato al metodo String.Concat. Questo metodo chiama quindi object.ToString() sul numero intero in scatola.

Così che si occupa della prima metà del:

Vorrei sapere il motivo per cui i è convertito in stringa nell'esempio di cui sopra, e in realtà non dare un errore di compilazione

La seconda metà è: perché non c'è errore di compilazione?

Perché dovrebbe esserci un errore di compilazione? La specifica C# dice che è possibile aggiungere qualsiasi stringa a qualsiasi oggetto o qualsiasi oggetto a qualsiasi stringa. Un int è un oggetto e pertanto è possibile aggiungerlo a una stringa.

+0

Mi piace la tua risposta. Ma non sono sicuro dell'ultima parte: se per intendenza vuoi dire che l'operatore + è definito nel modo in cui @brokenglass ha menzionato, sarei d'accordo ... – deostroll