Почему: строка st = "" + 12;работа в с # без конвертации? - PullRequest
3 голосов
/ 20 декабря 2010

Это очень глупо, но я погуглил и проверил ссылки, и я просто не могу найти ответ ... Почему int или float и т.д. могут быть добавлены как часть строки без разговора, но не самостоятельно?то есть:

в то время как это прекрасно работает:

 string st = "" + 12;

это не (конечно):

 string st = 12;

Где здесь магия?Я знаю, что это работает, я просто хочу знать, ПОЧЕМУ это работает, и как я контролирую, КАК выполняется преобразование?

Ответы [ 7 ]

4 голосов
/ 20 декабря 2010

В первом операторе левый операнд для + является строкой, и поэтому + становится оператором конкатенации.Компилятор находит перегрузку для этого оператора, который принимает строку и произвольное значение в качестве операндов.Это преобразует оба операнда в строки (используя ToString()), а затем соединяет их.

Второе выражение не работает, поскольку не существует неявного приведения из int в string.

. Вы можетеконтролировать, как выполняется преобразование, используя круглые скобки для изменения порядка операций (полуэффективно) или путем написания кода для упреждающей обработки преобразований.

1 голос
/ 20 декабря 2010

Конкретные строки в .NET в конечном итоге разрешают вызовы одной из перегрузок статических String.Concat .Это оптимизация для уменьшения количества временных строк, которые в противном случае могли бы быть созданы, когда множественные конкатенации происходят в одном операторе.

Короче говоря, это работает потому, что ряд перегрузок String.Concat примет object в списке аргументов, а поскольку int, float и т. Д. По сути являются объектами, они могут быть переданы в Concat.перегрузка, которая принимает один или несколько object параметров.Внутренне Concat в основном делает .ToString() на поступающем объекте, поэтому превращает ваш int в строковое представление.

В вашем конкретном примере

string st = "" + 12;

Компилятор восстановит, что первыйстрока пуста и просто вызывает перегрузку String.Concat(object).Который преобразует целое число 12 в строку и присваивает его st.

Эта перегрузка вызывается, потому что целое число может быть неявно упаковано в ячейку, чтобы соответствовать типу объекта и, следовательно, удовлетворять выбору перегрузки метода.

1 голос
/ 20 декабря 2010

Так работает конкатенация строк, и, как отмечено ответом BoltClock , компилятор использует + в качестве оператора конкатенации строк.Из спецификации C # Language о конкатенации строк мы находим, что:

Любой нестроковый аргумент преобразуется в его строковое представление, вызывая виртуальный метод ToString, унаследованный от типаobject.

0 голосов
/ 20 декабря 2010

Это потому, что компилятор переводит дополнение к вызову в String.Concat().

Внутренне все операнды упакованы (при необходимости) и передаются методу String.Concat (который, конечно, вызывает ToString()на все аргументы).

0 голосов
/ 20 декабря 2010

Поскольку первое является выражением, а C # выполняет неявное преобразование.

Второе - это присвоение со статическим значением, и у статического значения нет методов для вызова.

Пока значение, которое должно быть присвоено, является переменной или возвращаемым выражением, будет вызываться метод toSting.

0 голосов
/ 20 декабря 2010

Это работает из-за перегрузки оператора оператором + для типа данных строки.

0 голосов
/ 20 декабря 2010

Поскольку компилятор вызовет .ToString() для всех объектов, если один из параметров является строкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...