Строки и целые числа, неявные и явные
Вопрос
Коллега спросил меня об этом, и в моем затуманенном состоянии у меня не было ответа:
Почему это то, что вы можете сделать:
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 # для получения исчерпывающего списка неявных преобразований, поддерживаемых компилятором.
Редактировать:чтобы было понятно, в разделе спецификации языка, на который я ссылался, перечислены неявные преобразования, поддерживаемые компилятором, в то время как операторы типа "+" могут иметь свои собственные поддерживаемые преобразования.