Подтвердить что ты не робот

String = string + int: Что за кулисами?

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

string sth = "something" + 0;

Мои вопросы:

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

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

  • Как найти ответ на предыдущий вопрос?
4b9b3361

Ответ 1

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

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

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

Этот метод определяется следующим образом: (Взято из исходного источника .Net)

    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 или С# без оптимизации), чтобы увидеть, что компилирует строка +.

Ответ 2

Это указано в разделе 7.8.4 спецификации С# 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);

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

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

И результат:

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

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