Строки и целые числа, неявные и явные - PullRequest
9 голосов
/ 05 февраля 2009

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

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

string ham = "ham " + 4;

Но не:

string ham = 4;

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

Ответы [ 5 ]

19 голосов
/ 05 февраля 2009

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

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

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

4 голосов
/ 05 февраля 2009

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

Ссылка

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

Ссылка

2 голосов
/ 05 февраля 2009

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

0 голосов
/ 05 февраля 2009

Выражение

"ham " + 4 

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

Аналогичный и менее очевидный пример:

long myNumber = Int64.MaxValue - 1;

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

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

0 голосов
/ 05 февраля 2009

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

...