Cordes et ints, implicites et explicites
Question
Il y avait un collègue de travail me demander cela, et dans mon état du cerveau embrouillé je ne pas de réponse:
Pourquoi est-ce que vous pouvez faire:
string ham = "ham " + 4;
Mais pas:
string ham = 4;
S'il y a une fonte / opération implicite pour la conversion de chaîne lorsque vous êtes concaténer , pourquoi ne pas la même chose quand affectation comme une chaîne? (Sans faire une surcharge d'opérateur, bien sûr)
La solution
Lorsque concaténer le compilateur transforme la déclaration en un appel "ham" + 4
à String.Concat
, qui prend deux paramètres object
, la valeur est encaissée et 4
puis est appelé ToString
que.
Pour l'affectation il n'y a pas de conversion implicite de la int
string
, et vous ne pouvez donc pas à un <=> sans conversion explicite <=> elle.
En d'autres termes, les deux missions sont traitées de façon très différente par le compilateur, en dépit du fait qu'ils se ressemblent beaucoup en C #.
Autres conseils
Les opérateurs binaires + sont prédéfinis pour les types numériques et chaîne. pour numérique types, + calcule la somme de ses deux opérandes. Quand un ou les deux opérandes sont de type string, + Concatène les représentations de chaîne de la opérandes.
L'opérateur d'affectation (=) stocke les la valeur de son opérande à droite dans la emplacement de stockage, propriété ou indexeur désigné par son opérande gauche et retourne la valeur en tant que résultat. le opérandes doivent être du même type (ou l'opérande de droite doit être convertible implicitement le type de l'opérande de gauche).
Il n'y a pas de conversion implicite lorsque vous faites concaténation. concaténation String résout jusqu'à un appel String.Concat, qui a une surcharge qui prend les objets. Il est cette surcharge qui effectue une conversion (explicite) à chaîne.
La valeur du côté droit de la première expression est une chaîne, tandis que la valeur du côté droit de la deuxième expression est pas. Le concatonation fournit la magie dans le premier scénario, où l'affectation ne fait rien de spécial. Dans le second scénario, l'affectation continue de jouer muet.
L'expression
"ham " + 4
Force une conversion implicite de 4 à une chaîne basée sur la combinaison d'un type de chaîne et l'opérateur d'addition. Plus précisément, il est une qualité de l'opérateur « + », et lorsque l'opérateur fait une surcharge, vous pouvez mettre en œuvre manuellement le même genre de chose.
Un exemple similaire et moins évidente serait:
longue myNumber = Int64.MaxValue - 1;
Dans ce cas, « 1 » doit être évaluée comme un entier de 32 bits, mais il est implicitement converti. Vous pouvez consulter la section de spécification de langage C # 6.1 pour une liste exhaustive des conversions implicites pris en charge par le compilateur.
modifier. Pour être clair, la section de spécification de langage i fait référence aux listes des conversions implicites pris en charge par le compilateur, alors que les opérateurs comme « + » peuvent avoir leurs propres conversions prises en charge