2009-10-04 7 views
7

Wie der Titel sagt. Related to this question.Warum definiert C# keine Additionsoperation für Chars?

Warum funktioniert der folgende Code nicht? Es erscheint logisch logisch.

string foo = 'a' + 'b'; // Fails with an invalid int -> string conversion 

nun aus der oben verlinkten Frage können wir ableiten, was hier vor sich geht: der Compiler die implizite char verwendet -> int Umwandlung, dann diese Werte addiert. Dies führt zu der Annahme, dass keine Additionsoperation für char s definiert sein darf! Ist das wahr und wenn ja, warum gibt es keine?

EDIT: Der allgemeine Konsens ist, dass es nicht so viel ist, dass es nicht so definiert ist, wie die, die ich definiere, nicht ist.

+11

Wenn Sie eine Addition meinen, die die beiden Zeichen in eine Zeichenfolge umwandeln würde, liegt das daran, dass der Compiler keine Ahnung hat, was Sie tun möchten. Zugegeben, es könnte als Standardverhalten hinzugefügt worden sein, aber vielleicht würden andere Leute bevorzugen, dass Zeichen als Ganzzahlen hinzugefügt werden ... also müssten Sie hier eine Zeichenkette aus dem ersten Zeichen instanziieren und diese dann dem zweiten Zeichen manuell hinzufügen jede Fehlinterpretation vermeiden. – RedGlyph

+0

@redglyph: Ich würde es aufwerten, wenn es eine Antwort wäre. –

Antwort

15

Zunächst einmal ein Wort über Ihren deduktiven Prozess. Dein Abzug - dieses Zeichen wird in int umgewandelt, und deshalb gibt es keinen Zusatzoperator, der auf char definiert ist - Spot auf, so gut für dich. Aber ich bemerke, dass der Abzugsprozess unnötig war. Sie hätten einfach Abschnitt 7.7.4 der Spezifikation lesen können, in dem alle eingebauten Zusatzoperatoren eindeutig beschrieben sind. Kurz gesagt, sie sind int + int, uint + uint, lang + lang, ulong + ulong, float + float, double + double, dezimal + dezimal, enum-und-unterliegender Typ, Delegiertenkombination, string + string, string + object und Objekt + Zeichenfolge. (Und natürlich, die aufgehobenen Versionen von denen, die Werttypen beinhalten.) Ja, es gibt keine Additionsoperatoren, die Zeichen annehmen.

Zweitens, um Ihre "Warum nicht?" - Zeichen sind ein bisschen komisch. Ihr Speicher ist der der kurzen Ganzzahlen, aber ihre Semantik ist die der Zeichen in einer Zeichenkette. Sollte also ein Char als Ganzzahl oder als kurze Zeichenkette behandelt werden?Die Sprachdesigner entschieden sich in diesem Fall dazu, dem Vorbild früherer Sprachen wie C zu folgen und Zeichen wie Ganzzahlen zu behandeln, wenn sie Mathematik ohne Strings bearbeiten. Wenn Sie sie wie kurze Zeichenfolgen behandeln möchten, gibt es mehrere Möglichkeiten, Zeichen in Zeichenfolgen zu konvertieren. Das Anhängen der leeren Zeichenfolge, wie eine andere Antwort nahe legt, teilt dem Compiler eindeutig mit, dass "diese Operation für Zeichenfolgen und nicht für den Ganzzahlwert des Zeichens gilt".

+2

Hinzufügen in die leere Zeichenfolge ist unglaublich hässlich Stil. String.Concat ist der Weg zu gehen. –

3

Ich denke, man sollte sich auf das Wort "Warum" in Ihrer Frage konzentrieren. In C# wurde das Verhalten beim Hinzufügen von zwei Zeichen so definiert, dass "die Unicode-Werte hinzufügen" statt "verketten" bedeutet. Wir sind uns einig, dass dies vernünftiger definiert werden könnte, um "verketten" zu bedeuten, da Zeichenketten und Zeichen viel mehr verschiedene Einheiten von Ganzzahlen sind als in früheren Leben (z. B. die C-Programmiersprache).

'a' ist eine Zeichenkonstante. Traditionell war eine Zeichenkonstante, zumindest in C, nur eine andere Möglichkeit, eine ganze Zahl darzustellen. In diesem Fall ist der Unicode-Wert der Ganzzahl ('a' = 97, 'b' = 98 usw.). Daher wird der Ausdruck 'a' + 'b' so verstanden, dass diese zwei Unicode-Werte zusammen addiert werden.

Um das zu erreichen, was Sie erwarten, tun

String foo = "a" + "b"; // double quotes = single-character strings to concatenate 
+1

In diesem Fall kein ASCII. In C# sind Zeichen Unicode. –

+0

In C# sind die Dinge in dieser Hinsicht jedoch viel enger. Konkret funktioniert das nicht: 'char foo = 32;' –

+0

@James - danke für die Erinnerung. Es ist früh. Post aktualisiert entsprechend. –

3

Wie bereits gesagt, char eine Form von integer gilt eher als eine Zeichenfolge, so grundsätzlich eine Additionsoperation zwei Zahlen ist das Hinzufügen, anstatt Verkettung durchführen. Sie können zwei Zeichen in eine Zeichenfolge wie folgt erhalten:

string str = String.Format("{0}{1}", 'a', 'b'); 
1

Um Ihre Zeichen erhalten zu „add“ bis Sie eine von mehreren Dinge ähnlich wie Ihre ursprüngliche Absicht tun könnte:

string foo2 = 'a' + "" + 'b'; // Succeeds 
string foo3 = 'a'.ToString() + 'b'.ToString(); // Succeeds 
string foo4 = string.Concat('a', 'b'); // Succeeds 

Für die foo2 Beispiel: Sie geben dem Compiler einen Hinweis, indem Sie einen leeren String einfügen und ein implizites Zeichen zur String-Konvertierung für jedes Zeichen einzeln erzwingen.

Für das Beispiel foo3 verwenden Sie den ToString-Aufruf für jedes Zeichen, um das Hinzufügen von zwei Zeichenfolgen zu ermöglichen.

0

Sie könnten Überlastung der Additions-Operator für Zeichenfolge verwenden und versuchen, diese:

var result = "" + 'a' + 'b'; 

aber bitte nicht zu verwechseln mit

var result = 'a' + 'b' + ""; // BAD !!!!! 

, wie es Ihnen int zu String konvertiert geben und gleich "195".

Die Idee ist eine Überladung von Operator + für String zu kicken und Sie sollten das erste Argument als String haben, um dies zu erreichen.

Es sieht ein bisschen aus wie Betrug, aber das ist C# - sinnlos und gnadenlos! (eigentlich ist es. Net, die nicht Operator + Überladung für (Char, Char) und C# versucht Char zu Int32 zu werfen).

7

Was Sie suchen wirklich ist dies:

string foo = String.Concat('a', 'b'); 

Das ist, was der Compiler tut mit dem Operator ‚+‘ auf Saiten sowieso.

Dies ist etwa doppelt so schnell wie jeder String.Format Betrieb.

Verwandte Themen