ssortingng = ssortingng + int: Qu’est-ce qui se passe dans les coulisses?

En C #, vous pouvez implicitement concaténer une chaîne et, disons, un entier:

ssortingng sth = "something" + 0; 

Mes questions sont:

  1. Pourquoi, en supposant que vous pouvez implicitement concaténer une chaîne et un int, C # n’autorise pas l’initialisation des chaînes comme ceci:

     ssortingng sth = 0; // Error: Cannot convert source type 'int' to target type 'ssortingng' 
  2. Comment C # lance 0 comme chaîne. Est-ce 0.ToSsortingng() ou (ssortingng)0 ou autre chose?

  3. Comment trouver une réponse à la question précédente?

    Il comstack en un appel à Ssortingng.Concat(object, object) , comme ceci:

     ssortingng sth = Ssortingng.Concat("something", 0); 

    (Notez que cette ligne sera optimisée par le compilateur)

    Cette méthode est définie comme suit: (Extrait de la source de référence .Net)

      public static Ssortingng Concat(Object arg0, Object arg1) { if (arg0==null) { arg0 = Ssortingng.Empty; } if (arg1==null) { arg1 = Ssortingng.Empty; } return Concat(arg0.ToSsortingng(), arg1.ToSsortingng()); } 

    (Cela appelle Ssortingng.Concat(ssortingng, ssortingng) )


    Pour le découvrir, vous pouvez utiliser ildasm ou Reflector (dans IL ou C # sans optimisations) pour voir à quoi la ligne + est compilée.

    Ceci est spécifié dans la section 7.8.4 de la spécification C # 4:

    Pour une opération de la forme x + y , une résolution de surcharge d’opérateur binary (§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 parameters de l’opérateur sélectionné et le type de résultat correspond au type de retour de l’opérateur.

    Les opérateurs d’addition prédéfinis sont listés ci-dessous. Pour les types numeric et enumeration, les opérateurs d’addition prédéfinis calculent la sum des deux opérandes. Lorsqu’un ou les deux opérandes sont de type ssortingng, 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

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

    Ces surcharges de l’opérateur binary + effectuent une concaténation de chaîne. Si un opérande de concaténation de chaîne 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 ToSsortingng méthode virtuelle ToSsortingng héritée de l’object type. Si ToSsortingng renvoie null, une chaîne vide est remplacé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înes est une chaîne constituée des caractères de l’opérande gauche suivis des caractères de l’opérande droite. L’opérateur de concaténation de chaîne 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 ssortingng.Concat .