9
votes

Pourquoi l'entier est-il converti en chaîne dans ce cas?

Qu'est-ce qui se passe ci-dessous? XXX

i est converti en chaîne dans les deux cas. Je me confonde avec l'idée de la priorité de l'opérateur (bien que cet exemple ne montre pas beaucoup de cela) et la direction d'évaluation. Parfois, l'évaluation arrive de gauche à droite ou inversement. Je ne connais pas exactement la science de la façon dont l'expression est évaluée ...

pourquoi est i converti en chaîne dans l'exemple ci-dessus et ne donne pas à une erreur de compilation?


0 commentaires

4 Réponses :


8
votes

Dans les deux cas, vous avez l'opérateur + avec la chaîne comme un des opérandes. Il n'y a pas d'opérateurs définis par l'utilisateur surchargé impliqué, de sorte que le compilateur utilisera de ceux que des situations de concaténation de chaînes.

Autant que je sache, le compilateur C # n'utilisera que la concaténation de chaînes pour un scénario de x + y x ou y est une expression string au moment de la compilation s'il existe une surcharge définie par l'utilisateur, par exemple opérateur xName + (xNamespace, chaîne ) opérateur.


0 commentaires

23
votes

de la spécification C # Spec - Section 7.7.4 Opérateur d'addition:

Concaténation de chaîne forte>: p>

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


1 commentaires

Merci - je n'ai pas pu arriver à la spécification rapidement :)



0
votes

En réalité, l'opérateur "+" est pour la concaténation. Faire une concaténation entre une INT et une chaîne donnera une chaîne (avec une chaîne automatiquement à la chaîne)


1 commentaires

L'utilisation de "+" entre les variables numériques dans la console.Writeine ​​entraînera une somme de celles des variables numériques dans la sortie.



18
votes

Je me confondre avec l'idée de la prévention de l'opérateur et de la direction de l'évaluation. p>

Non, vous n'êtes pas. Qui est souvent confondu, oui, mais ce n'est pas la chose que vous êtes confus, car aucun ordre d'évaluation n'est pertinent em> à la question de savoir si l'entier est converti à une chaîne ou pourquoi il est légal Pour ajouter un entier à une chaîne. P>

Pour vous être confondu sur le point que vous prétendez être confus, les règles sont assez simples: p>

  • Les expressions sont parenthèses selon la préséance et l'associativité de l'opérateur. LI>
  • Les subexpressions sont évaluées dans l'ordre de gauche à droite. LI> ul>

    C'est tout ce que vous devez savoir pour le faire correctement. Supposons Q () renvoie un objet comportant un indexeur avec un seigter et les autres méthodes de retour des entiers: p> xxx pré>

    entre parenthèses en fonction de la priorité et de l'associativité: P >

       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);
    


1 commentaires

J'aime ta réponse. Mais je ne suis pas sûr de la dernière partie: si par spécification, vous voulez dire que l'opérateur + est défini comme @Brokenglass mentionné, je suis d'accord ...