представьте в виде строки = строка + интервал: Что негласно?

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

string sth = "something" + 0;

Мои вопросы:

  1. Да ведь путем принятия того, что можно неявно связать строку и интервал, C# запрещает строки инициализации как это:

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

  3. Как найти ответ предыдущего вопроса?
49
задан Dariusz Woźniak 20 September 2014 в 20:57
поделиться

2 ответа

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

52
ответ дан 7 November 2019 в 11:48
поделиться

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

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

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

Последнее предложение наиболее актуально для данной ситуации.

Затем позже:

Объединение строк

 оператор строки + (строка x, строка y);
строковый оператор + (строка x, объект y);
строковый оператор + (объект x, строка y);

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

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

И результат:

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

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

22
ответ дан 7 November 2019 в 11:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: