string = string + int: Что за кадром? - PullRequest
48 голосов
/ 03 августа 2010

В C # вы можете неявно объединить строку и, скажем, целое число:

string sth = "something" + 0;

Мои вопросы:

  1. Почему, предполагая, чтовы можете неявно объединять строку и int, C # запрещает инициализацию строк следующим образом:

    string sth = 0; // Error: Cannot convert source type 'int' to target type 'string'
    
  2. Как C # преобразует 0 в строку.Это 0.ToString() или (string)0 или что-то еще?

  3. Как найти ответ на предыдущий вопрос?

Ответы [ 2 ]

50 голосов
/ 03 августа 2010

Он компилируется в вызов String.Concat(object, object), например:

string sth = String.Concat("something", 0);

(Обратите внимание, что эта конкретная строка будет фактически оптимизирована компилятором)

Этот метод определен следующим образом: (взято из .Net Reference Source)

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

        if (arg1==null) { 
            arg1 = String.Empty;
        } 
        return Concat(arg0.ToString(), arg1.ToString());
    }

(Звонит String.Concat(string, string))


Чтобы обнаружить это, вы можете использовать ildasm или Reflector (в IL или в C # без оптимизаций), чтобы увидеть, к чему соответствует строка +.

22 голосов
/ 03 августа 2010

Это указано в разделе 7.8.4 спецификации C # 4:

Для операции вида x + y применяется разрешение перегрузки двоичного оператора (§7.3.4) для выбораконкретный оператор реализации.Операнды преобразуются в типы параметров выбранного оператора, а тип результата является типом возврата оператора.

Предопределенные операторы сложения перечислены ниже.Для числовых типов и типов перечисления предопределенные операторы сложения вычисляют сумму двух операндов.Когда один или оба операнда имеют тип string, предопределенные операторы сложения объединяют строковое представление операндов.

Последнее предложение является наиболее подходящим для этой ситуации.

Тогдапозже:

Конкатенация строк

string operator +(string x, string y);

string operator +(string x, object y);

string operator +(object x, string y);

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

Указывает, как целое число преобразуется в строку.

И результат:

Результатом оператора конкатенации строк является строка, состоящая из символов левого операнда, за которыми следуют символы правого операнда.Оператор конкатенации строк никогда не возвращает нулевое значение.

Фактическое средство выполнения конкатенации зависит от реализации, но, как отмечено в других ответах, реализация MS использует string.Concat.

...