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)

Était-ce utile?

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.

Référence

  

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

Référence

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top