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.
Grazie - non è possibile ottenere rapidamente le specifiche :) –