L'opérateur +=
utilise l'opérateur +
, de sorte que le premier est vraiment:
o = o + c;
Ce que le compilateur crée en fait est:
o = String.Concat((object)o, (object)c);
L'entier est emballé, et la méthode Concat
qui prend object
paramètres est appelée. La méthode ToString
sera appelée sur les deux paramètres pour obtenir leurs valeurs de chaîne, et elles sont concaténées.
Si vous commencez à convertir l'entier à une chaîne, le code est plus direct:
o += c.ToString();
qui devient:
o = String.Concat(o, c.ToString());
Dans le second code, les types de l'opérateur conditionnel doesn 't match:
bool ? string : int
Les deuxième et troisième opérandes doivent avoir le même type, l IKE dans le troisième code:
bool ? string : string
Le second code devient vraiment:
o = String.Concat(
o,
P == 2
? String.Concat((object)".", (object)c)
: c
);
et le troisième code devient vraiment:
o = String.Concat(
o,
P == 2
? String.Concat((object)".", (object)c)
: String.Concat((object)String.Empty, (object)c)
);
Quoi qu'il en soit, vous devriez envisager d'utiliser un StringBuilder
pour construire chaînes au lieu d'utiliser l'opérateur +=
:
StringBuilder builder = new StringBuilder;
if (P == 2) {
builder.Append('.');
}
builder.Append(c);
Ahh, merci. Je n'ai pas réalisé que les deux côtés devaient être du même type. Cela a du sens cependant. Je ne peux pas encore accepter une réponse, attendez quelques minutes. – 182764125216
Ce n'est pas aussi strict que vous le dites. Il doit y avoir une conversion soit de la conséquence au type de l'alternative, soit de l'alternative au type de la conséquence. (Mais, s'ils diffèrent, pas les deux.) Le comportement ici est subtil; pour certaines de ces subtilités, voir mes articles sur le sujet: http://blogs.msdn.com/b/ericlippert/archive/tags/conditional+operator/ –