Оператор +=
использует оператор +
, поэтому первый действительно:
o = o + c;
То, что на самом деле создает компилятор:
o = String.Concat((object)o, (object)c);
Целое число заключено в квадрат, и вызывается метод Concat
, который принимает параметры object
. Метод 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);