Ich verwechsle mich mit der Idee der Operatorenpräzedenz und der Auswertungsrichtung.
Nein, sind Sie nicht. Das ist häufig verwechselt, ja, aber das ist nicht das Ding, das Sie verwirren, da weder die Priorität noch die Reihenfolge der Auswertung relevant auf die Frage, ob die ganze Zahl in eine Zeichenfolge umgewandelt wird, oder warum es zulässig ist, eine ganze Zahl hinzuzufügen ein Faden. zu verwechseln auf, die Regeln sind ganz einfach
Um unconfuse Sie zuerst auf den Punkt, den Sie behaupten:
- Ausdrücke werden klammerten nach Operator Vorrang und Assoziativität.
- Unterausdrücke werden in der Reihenfolge von links nach rechts ausgewertet.
Das ist alles, was Sie wissen müssen, um es richtig zu machen. Es sei Q() gibt ein Objekt, das einen Indexer mit einem Setter hat, und die anderen Methoden alle Rückgabe ganzen Zahlen:
Q()[R()] = A() * B() + C()/D();
Das nach Vorrang klammerten und Assoziativität:
Q()[R()] = ((A() * B()) + (C()/D()));
Und jetzt jeder Teilausdruck wird von links nach rechts ausgewertet. Jeder Teilausdruck, einschließlich Unterausdrücken, die selbst Teilausdrücke haben. Das entspricht also dem Programm:
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;
und schließlich wird der Indexsetzer auf q mit Index r und Wert t3 aufgerufen.
Beachten Sie, dass jeder Teilausdruck auf der linken Seite vor jedem Teilausdruck nach rechts ausgewertet wird. A() * B()
ist von C()/D()
links, so passiert es zuerst.
Das hat überhaupt nichts mit Ihrer Frage zu tun. Ihre Frage basiert auf einem Missverständnis.
Ich möchte wissen, warum ich auf Zeichenfolge in dem obigen Beispiel umgewandelt wird, und eigentlich kein Übersetzungsfehler geben
Es ist dein Missverständnis. i
ist nicht wird in Zeichenfolge konvertiert. Es wird in object
konvertiert. Ihr Programm ist genau entspricht:
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);
Wie Sie sehen können, gibt es keine Konvertierung von i
bespannen an erster Stelle. i
wird über eine Box-Konvertierung in ein Objekt konvertiert und dann an die Methode String.Concat
übergeben. Diese Methode ruft dann object.ToString()
für die Box-Ganzzahl auf.
So, die sich mit der ersten Hälfte von:
Ich möchte wissen, warum ich auf Zeichenfolge in dem obigen Beispiel umgewandelt wird, und nicht wirklich einen Kompilierungsfehler geben
Die zweite Hälfte ist: Warum gibt es keinen Kompilierungsfehler?
Warum sollte es einen Kompilierungsfehler geben? Die C# -Spezifikation besagt, dass Sie jeder beliebigen Zeichenfolge oder jedem beliebigen Objekt eine beliebige Zeichenfolge hinzufügen können. Ein int ist ein Objekt und Sie können es daher zu einer Zeichenfolge hinzufügen.
Danke - Konnte nicht schnell zur Spezifikation kommen :) –