En C #, vous pouvez implicitement concaténer une chaîne et disons, un entier:
string sth = "something" + 0;
Mes questions sont:
Pourquoi, en supposant que vous pouvez concaténer implicitement une chaîne et un entier, C # interdit d'initialiser des chaînes comme ceci:
string sth = 0; // Error: Cannot convert source type 'int' to target type 'string'
Comment C # convertit 0 en chaîne. Est-ce 0.ToString()
ou (string)0
Ou autre chose?
Il compile un appel à String.Concat(object, object)
, comme ceci:
string sth = String.Concat("something", 0);
(Notez que cette ligne particulière sera en fait optimisée par le compilateur)
Cette méthode est définie comme suit: (Tiré de la source de référence .Net)
public static String Concat(Object arg0, Object arg1) {
if (arg0==null) {
arg0 = String.Empty;
}
if (arg1==null) {
arg1 = String.Empty;
}
return Concat(arg0.ToString(), arg1.ToString());
}
(Cela appelle String.Concat(string, string)
)
Pour découvrir cela, vous pouvez utiliser ildasm
, ou Reflector (en IL ou en C # sans optimisation) pour voir à quoi la ligne +
Se compile.
Ceci est spécifié dans la section 7.8.4 de la spécification C # 4:
Pour une opération du formulaire
x + y
, la résolution de surcharge d'opérateur binaire (§7.3.4) est appliquée pour sélectionner une implémentation d'opérateur spécifique. Les opérandes sont convertis en types de paramètres de l'opérateur sélectionné et le type du résultat est le type de retour de l'opérateur.Les opérateurs d'addition prédéfinis sont répertoriés ci-dessous. Pour les types numériques et d'énumération, les opérateurs d'addition prédéfinis calculent la somme des deux opérandes. Lorsqu'un ou les deux opérandes sont de type chaîne, les opérateurs d'addition prédéfinis concaténent la représentation sous forme de chaîne des opérandes.
La dernière phrase est la plus pertinente pour cette situation.
Puis plus tard:
Concaténation de chaînes
string operator +(string x, string y); string operator +(string x, object y); string operator +(object x, string y);
Ces surcharges de l'opérateur binaire + effectuent la concaténation de chaînes. Si un opérande de concaténation de chaînes est nul, une chaîne vide est substituée. Sinon, tout argument non-chaîne est converti en sa représentation sous forme de chaîne en appelant la méthode virtuelle
ToString
héritée de l'objet type. SiToString
renvoie null, une chaîne vide est substituée.
Cela spécifie comment l'entier est converti en chaîne.
Et le résultat:
Le résultat de l'opérateur de concaténation de chaîne est une chaîne qui se compose des caractères de l'opérande de gauche suivis des caractères de l'opérande de droite. L'opérateur de concaténation de chaînes ne renvoie jamais de valeur nulle.
Le moyen réel d'effectuer la concaténation est spécifique à l'implémentation, mais comme indiqué dans d'autres réponses, l'implémentation MS utilise string.Concat
.