+= 运算符使用+ 运算符,所以第一个是真的:
o = o + c;
编译器实际创建的是:
o = String.Concat((object)o, (object)c);
整数被装箱,并调用带有object参数的Concat方法。 ToString 方法将在两个参数上调用以获取它们的字符串值,并将它们连接起来。
如果首先将整数转换为字符串,代码会更直接:
o += c.ToString();
变成:
o = String.Concat(o, c.ToString());
在第二个代码中,条件运算符中的类型不匹配:
bool ? string : int
第二个和第三个操作数必须具有相同的类型,就像在第三个代码中一样:
bool ? string : string
第二个代码真的变成了:
o = String.Concat(
o,
P == 2
? String.Concat((object)".", (object)c)
: c
);
第三个代码真的变成了:
o = String.Concat(
o,
P == 2
? String.Concat((object)".", (object)c)
: String.Concat((object)String.Empty, (object)c)
);
无论如何,您应该考虑使用StringBuilder 来构建字符串,而不是使用+= 运算符:
StringBuilder builder = new StringBuilder;
if (P == 2) {
builder.Append('.');
}
builder.Append(c);