66 votes

char + char = int? Pourquoi?

Pourquoi est l'ajout de deux char en C# les résultats à un int type?

Par exemple, quand je fais ceci:

var pr = 'R' + 'G' + 'B' + 'Y' + 'P';

l' pr variable devient un int type. On peut s'attendre à un string type avec la valeur "RGBYP".

Pourquoi le C# conçue de cette façon? N'était pas le défaut de mise en œuvre de l'ajout de deux chars doit être issu d'un string qui concatène l' chars, pas int?

79voto

Dirk Points 5116

Accoding à la documentation de char, il peut être implicitement converti en valeurs entières. L' char type ne définit pas une coutume operator + donc l'un pour les entiers est utilisé.

La justification de l'existence d'aucune conversion implicite en chaîne est bien expliqué dans le premier commentaire de Eric Lippert dans son billet de blog sur le "Pourquoi n'char convertir implicitement à ushort, mais pas vice-versa?":

Il a été jugé dans v1.0. La langue de conception de notes du 6 juin 1999-dire "Nous avons discuté de savoir si une telle conversion doit exister, et a décidé qu'il serait étrange pour fournir une troisième façon de le faire la conversion. [La langue] prend déjà en charge les deux c.ToString() et le nouveau Chaîne(c)".

(crédit JimmiTh pour trouver cette citation)

16voto

KeithS Points 36130

char est un type de la valeur, du sens qu'il a une valeur numérique (son Unicode UTF-16 ordinale). Cependant, il n'est pas considéré comme un type numérique (comme int, float, etc) et, par conséquent, l'opérateur + n'est pas défini pour le char.

Le type char peut, cependant, être implicitement converti au numérique de type int. Parce qu'il est implicite, le compilateur est autorisé à procéder à la conversion pour vous, en fonction d'un ensemble de règles de priorité énoncées dans le C# spec. int est l'une des premières choses que normalement essayé. Qui fait le + de l'opérateur valide, et donc c'est l'opération effectuée.

Pour faire ce que vous voulez, vous commencez avec une chaîne vide:

var pr = "" + 'R' + 'G' + 'B' + 'Y' + 'P';

Contrairement à la type char, le type de chaîne définit une surcharge opérateur + pour l'Objet, ce qui transforme le deuxième terme, quel qu'il soit, dans une chaîne à l'aide de ToString() avant de les concaténer pour le premier terme. Cela signifie pas de conversion implicite est effectuée; votre pr variable est maintenant déduite comme une chaîne de caractères et qui est la concaténation de toutes les valeurs de type caractère.

8voto

Ted Points 1146

Parce qu'un seul char peut être convertie en une valeur Unicode et peut être facilement stocké sous forme d'entier en prenant moins d'espace qu'une seule chaîne de caractères.

7voto

Erno de Weerd Points 30391

À partir de la MSDN:

La valeur d'un Char objet est un 16 bits numérique (ordinale).

Un char est un type intégral. Il n'est PAS un personnage, c'est un nombre!

'a' est juste un raccourci pour un certain nombre.

Ainsi, l'ajout de deux caractère résultats dans un certain nombre.

Jetez un oeil à cette question sur l'ajout d'octets, il est, bien que contraire à l'intuition, la même chose.

6voto

Rawling Points 21932

Un autre bit de la spécification, à la section 4.1.5 (les Types Intégraux) après avoir défini, char tant que partie intégrante de type:

Pour le binaire + ... les opérateurs, les opérandes sont convertis en type TT est le premier d' int, uint, long et ulong que peut bien représenter toutes les valeurs possibles des deux opérandes.

Donc, pour l' char, les deux sont convertis int et ensuite ajouté qu' ints.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X