Warum definiert C # keine Additionsoperation für Chars?

7

Wie der Titel sagt. Bezieht sich auf diese Frage.

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

%Vor%

Nun können wir aus der obigen verknüpften Frage ableiten, was hier vor sich geht: Der Compiler benutzt das implizite Zeichen - & gt; int-Konvertierung und dann diese Werte hinzufügen. Das lässt mich glauben, dass für char s keine Additionsoperation definiert sein muss! Ist das wahr und wenn ja, warum gibt es keine?

BEARBEITEN: Der allgemeine Konsens besteht darin, dass es nicht so sehr darauf ankommt, dass es einen gibt, der so definiert ist wie der, den ich definiere, nicht.

    
Matthew Scharley 04.10.2009, 14:40
quelle

6 Antworten

15

Zunächst 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 Nullwertversionen von denen, die Werttypen beinhalten.) Also, es gibt keine Additionsoperatoren, die Zeichen annehmen.

Zweitens, um Ihr "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 Beispiel früherer Sprachen wie C zu folgen und Buchstaben 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 suggeriert, teilt dem Compiler eindeutig mit, dass "diese Operation für Zeichenfolgen und nicht für den Ganzzahlwert des Zeichens gilt".

    
Eric Lippert 04.10.2009, 15:13
quelle
7

Was Sie wirklich suchen, ist dies:

%Vor%

Was der Compiler mit dem '+' Operator an Strings sowieso macht.

Das ist ungefähr doppelt so schnell wie jede Operation String.Format .

    
John Gietzen 04.10.2009 16:14
quelle
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 Strings und Zeichen viel mehr verschiedene Entitäten von ganzen Zahlen sind als in früheren Leben (z. B. The 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 bedeutet der Ausdruck 'a' + 'b', dass diese zwei Unicode-Werte addiert werden.

Um zu erreichen, was Sie erwarten, tun Sie

%Vor%     
Bob Kaufman 04.10.2009 14:44
quelle
3

Wie bereits erwähnt, wird char als eine Form einer Ganzzahl und nicht als eine Zeichenkette betrachtet, so dass eine Additionsoperation grundsätzlich zwei Zahlen hinzufügt, anstatt eine Verkettung durchzuführen. Sie können zwei Zeichen in eine Zeichenfolge wie diese aufnehmen:

%Vor%     
Jez 04.10.2009 14:52
quelle
1

Um Ihre Zeichen zum "Hinzufügen" zu bringen, können Sie eine der folgenden Aktionen ausführen:

%Vor%

Für das Beispiel foo2 geben Sie dem Compiler einen Hinweis, indem Sie einen leeren String einfügen und ein implizites char zur String-Konvertierung für jedes char 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.

    
Paul Sasik 04.10.2009 14:56
quelle
0

Sie könnten die Überladung des Additionsoperators für die Zeichenfolge verwenden und dies versuchen:

%Vor%

aber bitte nicht mit

verwechseln %Vor%

, da Sie int in eine Zeichenfolge umgewandelt und gleich "195" erhalten.

Die Idee ist, eine Überladung von operator + zu haben, damit die Zeichenfolge ankommt und Sie sollten das erste Argument als String haben, um dies zu erreichen.

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

    
Konstantin Spirin 04.10.2009 16:00
quelle

Tags und Links