2012-05-02 17 views
9

Was passiert unten?Warum wird die Ganzzahl in diesem Fall in eine Zeichenfolge konvertiert?

i wird in beiden Fällen in eine Zeichenfolge konvertiert. Ich verwechsle mich mit der Idee der Operatorenpräzedenz (obwohl dieses Beispiel nicht viel davon zeigt) und der Evaluierungsrichtung. Manchmal erfolgt die Auswertung von links nach rechts oder umgekehrt. Ich weiß nicht genau, wie der Ausdruck bewertet wird ...

Warum wird im obigen Beispiel i in eine Zeichenfolge konvertiert und gibt es keinen Kompilierungsfehler?

Antwort

23

Von der C# spec - Abschnitt 7.7.4 Additionsoperator:

String Verkettung:

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

Der binäre Operator + führt Verkettung Zeichenfolge, wenn eine oder beide Operanden vom Typ String. Wenn ein Operand der String-Verkettung null ist, wird eine leere Zeichenfolge ersetzt. Andernfalls wird in seine String-Darstellung jedes nicht-String-Argument umgewandelt, indem die virtuelle ToString Methode von Typ Objekt geerbt aufrufen. Wenn ToString null zurückgibt, wird eine leere Zeichenfolge ersetzt.

+2

Danke - Konnte nicht schnell zur Spezifikation kommen :) –

8

In beiden Fällen haben Sie den Operator + mit der Zeichenfolge einen der Operanden. Es sind keine überladenen benutzerdefinierten Operatoren beteiligt, daher verwendet der Compiler sowohl als Zeichenfolgenverkettungssituationen.

Soweit mir bekannt ist, wird der C# Compiler nicht nur String-Verkettung für ein Szenario von x + y wo entwederx oder y ist ein string Ausdruck zur Compile-Zeit zu verwenden, wenn es eine benutzerdefinierte Überlastung ist, z.B. der Operator XName operator +(XNamespace, string).

0

Eigentlich ist der "+" Operator für Verkettung. Die Verkettung zwischen einem int und einer Zeichenkette ergibt eine Zeichenkette (mit automatischem int Zeichen in Zeichenkette)

+0

Die Verwendung von "+" zwischen numerischen Variablen in Console.WriteLine führt zu einer Summe dieser Werte zu numerischen Variablen in der Ausgabe. – SoEnLion

18

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.

+0

Ich mag deine Antwort. Aber ich bin mir nicht ganz sicher, ob der letzte Teil auch wirklich so sein wird: Wenn der Begriff "+" genau so definiert ist wie @brokenglass, würde ich zustimmen ... – deostroll