Frage

Wir hatten ein Mitarbeiter fragen mich diese, und in meinem Gehirn verwirrten Zustand habe ich keine Antwort:

Warum ist es, dass Sie tun können:

string ham = "ham " + 4;

Aber nicht:

string ham = 4;

Wenn es eine implizite Umwandlung / Betrieb für String-Konvertierung, wenn Sie sind Verkettungs , warum nicht das gleiche, wenn Zuordnung als String? (Ohne einige Betreiber Überlastung zu tun, natürlich)

War es hilfreich?

Lösung

Wenn der Compiler die Anweisung verketten "ham" + 4 in einen Aufruf wendet sich an String.Concat, die zwei object Parameter nimmt, so dass der Wert 4 eingerahmt wird und dann ToString auf das genannt.

Für die Zuordnung gibt es keine implizite Konvertierung von int zu string, und daher kann man nicht 4 zu einem string zuweisen, ohne es explizit zu konvertieren.

Mit anderen Worten: die beiden Zuordnungen sind sehr unterschiedlich vom Compiler behandelt, trotz der Tatsache, dass sie in C # sehr ähnlich aussehen.

Andere Tipps

  

Binary + Operatoren sind vordefiniert für   numerische und String-Typen. für numerische   Typen berechnet + die Summe ihrer beiden   Operanden. Wenn einer oder beide Operanden   die sind vom Typ String, + verkettet   String-Darstellungen der   Operanden.

Referenz

  

Der Zuweisungsoperator (=) speichert die   Wert seiner rechten Operanden in der   Lagerort, das Eigentum oder Indexer   bezeichnet mit ihrem linken Operanden und   gibt den Wert als Ergebnis. Das   Operanden müssen vom gleichen Typ sein (oder   der rechte Operand muss sein   implizit umwandelbar in der Art der   der linke Operand).

Referenz

Es gibt keine implizite Konvertierung, wenn Verkettung zu tun. String-Verkettung löst zu einem String.Concat Anruf nach unten, die eine Überlast hat, welche Objekte erfolgt. Es ist diese Überlastung, die eine (explizite) Umwandlung in eine Zeichenfolge führt.

Der Wert der rechten Seite des ersten Ausdrucks ist ein String, während der Wert der rechten Seite des zweiten Ausdrucks nicht. Die concatonation stellt die Magie im ersten Szenario, in dem die Zuordnung nichts Besonderes zu tun. Im zweiten Szenario geht die Zuordnung dumm zu stellen.

Der Ausdruck

"ham " + 4 

Erzwingt eine implizite Umwandlung von 4 in einen String basierend auf der Kombination aus einem String-Typ und den Additionsoperator. Insbesondere ist es eine Qualität des Operators „+“, und wenn eine Überlastung zu tun Operator können Sie manuell die gleiche Art von Sache umzusetzen.

Ein ähnliches und weniger offensichtliches Beispiel wäre:

long myNumber = Int64.MaxValue - 1;

In diesem Fall „1“ sollte als ein 32-Bit-Integer ausgewertet werden, aber es wird implizit konvertiert. Sie können den # -Sprache spec Abschnitt 6.1 für eine vollständige Liste von impliziten Konvertierungen C überprüfen vom Compiler unterstützt.

bearbeiten. Klar sein, der Sprache spec Abschnitt i vom Compiler unterstützten Listen impliziter Konvertierungen bezeichnet, während Operatoren wie „+“ kann ihre eigene unterstützte Conversions

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top