Вопрос

Коллега спросил меня об этом, и в моем затуманенном состоянии у меня не было ответа:

Почему это то, что вы можете сделать:

string ham = "ham " + 4;

Но не:

string ham = 4;

Если существует неявное приведение / операция для преобразования строки, когда вы объединение, почему не то же самое , когда присвоение это как строка?(Без какой-либо перегрузки оператора, конечно)

Это было полезно?

Решение

При конкатенации компилятор преобразует оператор "ham" + 4 в призыв к String.Concat, что занимает два object параметры, поэтому значение 4 упаковывается в коробку, а затем ToString призван к этому.

Для присваивания нет неявного преобразования из int Для string, и , таким образом , вы не можете назначить 4 к a string без явного преобразования его.

Другими словами, два назначения обрабатываются компилятором совершенно по-разному, несмотря на то, что в C # они выглядят очень похожими.

Другие советы

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

Ссылка

Оператор присваивания (=) сохраняет значение своего правого операнда в месте хранения, свойстве или индексаторе обозначается его левым операндом и возвращает значение в качестве результата. Операнды должны быть одного типа (или правый операнд должен быть неявно преобразован в тип левого операнда).

Ссылка

При выполнении конкатенации нет неявного преобразования.Конкатенация строк преобразуется в строку.Вызов Concat, который имеет перегрузку, которая принимает объекты.Именно эта перегрузка выполняет (явное) преобразование в строку.

Значение правой части первого выражения является строкой, в то время как значение правой части второго выражения таковым не является.Конкатонация обеспечивает волшебство в первом сценарии, где назначение не делает ничего особенного.Во втором сценарии задание продолжает вести себя глупо.

Выражение

"ham " + 4 

Принудительно выполняет неявное преобразование 4 в строку на основе комбинации строкового типа и оператора сложения.В частности, это качество оператора "+", и при выполнении перегрузки оператора вы можете вручную реализовать то же самое.

Аналогичным и менее очевидным примером может быть:

длинный myNumber = Int64.MaxValue - 1;

В этом случае "1" должно быть вычислено как 32-битное целое число, но оно неявно преобразуется.Вы можете ознакомиться с разделом 6.1 спецификации языка C # для получения исчерпывающего списка неявных преобразований, поддерживаемых компилятором.

Редактировать:чтобы было понятно, в разделе спецификации языка, на который я ссылался, перечислены неявные преобразования, поддерживаемые компилятором, в то время как операторы типа "+" могут иметь свои собственные поддерживаемые преобразования.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top