Почему (строка) int32 всегда выбрасывает: не удается преобразовать тип 'int' в 'строку' - PullRequest
4 голосов
/ 30 января 2009

Почему (строка) int32 всегда выбрасывает: Невозможно преобразовать тип 'int' в 'строку'

public class Foo
    {   
        private int FooID;
        public Foo()
        {
            FooID = 4;
            string s = (string)FooID; //throws compile error
            string sss = FooID.ToString(); //no compile error
        }
    }

Ответы [ 9 ]

39 голосов
/ 30 января 2009

Поскольку преобразование типов из Int32 в строку не определено. Вот для чего предназначен метод ToString.

20 голосов
/ 30 января 2009

Если вы сделали это:

string s = (string)70;

Что бы вы ожидали в с?

A. «70» число написано так, как его читают люди.
B. "+70" число, написанное с положительным индикатором впереди.
C. "F" символ, представленный ASCII-кодом 70 .
D. "\ x00 \ x00 \ x00F" - четыре байта целого, каждый из которых отдельно конвертируется в их представление ASCII.
E. "\ x0000F" int разделяется на два набора по два байта, каждый из которых представляет символ Unicode.
F. "1000110" двоичное представление для 70.
G. "70 долларов" - целое число, конвертированное в валюту
H. Что-то еще.

Компилятор не может сказать, поэтому он заставляет вас делать это долго.

Есть два "длинных пути". Первый - использовать одну из перегрузок Convert.ToString () примерно так:

string s = Convert.ToString(-70, 10);

Это означает, что он преобразует число в строку с использованием нотации 10. Если число отрицательное, оно отображает «-» в начале, в противном случае оно просто показывает число. Однако, если вы преобразуете в двоичное, восьмеричное или шестнадцатеричное, отрицательные числа отображаются в два дополнения , поэтому Convert.ToString (-7, 16) становится "ffffffba".

Другой «длинный путь» - использовать ToString с формататором строк, например так:

string s2 = 70.ToString("D");

D является кодом форматера и сообщает методу ToString, как преобразовать в строку. Некоторые из интересных кодов перечислены ниже:

"D" Десятичный формат, состоящий из цифр 0-9 и "-" в начале, если это необходимо. Например. -70 становится "-70".
«D8» Я показал 8, но может быть любым числом. То же, что и десятичное число, но оно дополняется нулями до необходимой длины. Например. -70 становится "-00000070".
«N» Тысячи разделителей вставляются, и в конце добавляется «.00». Например. -1000 становится "-1,000.00".
«C» Символ валюты добавляется в начале после «-», тогда он такой же, как «N». Например. Использование en-Gb культуры -1000 становится "- £ 1,000.00".
"X" шестнадцатеричный формат. Например. -70 становится "46".

Примечание: Эти форматы зависят от текущих настроек культуры, поэтому, если вы используете en-Us, вы получите «$» вместо «£» при использовании кода формата «C».

Для получения дополнительной информации о кодах формата см. MSDN - Стандартные строки числового формата .

11 голосов
/ 30 января 2009

При выполнении операции приведения типа, например, (string)30, вы в основном говорите компьютеру, что «этот объект достаточно похож на объект, к которому я приведен, что я не потеряю много (или любые) данные / функциональность» .

При преобразовании числа в строку происходит потеря данных. Строка не может выполнять математические операции и не может выполнять числовые операции.

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

int test1 = 34;
double test2 = (double)test1;

Но не это:

int test1 = 34;
string test2 = (string)test1;

Этот пример не идеален, поскольку (IIRC) преобразование здесь неявное, однако идея заключается в том, что при преобразовании в двойное число вы не теряете никакой информации. Этот тип данных все еще может в основном действовать одинаково, будь то double или int. То же самое нельзя сказать о int string.

Кастинг (обычно) разрешен только тогда, когда вы не потеряете много функциональности после того, как конвертация завершена.

Метод .ToString() отличается от приведения, поскольку это просто метод, который возвращает тип данных string.

5 голосов
/ 30 января 2009

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

Я знаю, что при запуске в C # (и из C ++) я столкнулся с приведением типов, которые, казалось, должны были работать. C ++ немного более либерален, когда дело доходит до такого рода вещей, поэтому в C # дизайнеры хотели, чтобы вы знали, когда преобразование типов было неоднозначным или опрометчивым. Тип Convert затем заполняет пробелы, позволяя вам явно преобразовать и понять побочные эффекты .

5 голосов
/ 30 января 2009

Int не имеет явного оператора для строки. Однако они имеют Int32.ToString () ;. Возможно, вы можете создать его с помощью методов Extension, если вы действительно хотите.

4 голосов
/ 30 января 2009

Int32 нельзя преобразовать в строку, поскольку компилятор C # не знает, как преобразовать один тип в другой.

Почему, спросите вы, причина в том, что простой int32 - это тип integer / numeric, а string - это, ну, ну, в общем, строка / символы. Вы можете преобразовать числовой тип в другой числовой тип (например, с плавающей точкой в ​​int, но будьте осторожны с возможной потерей точности). Если бы все возможные преобразования были закодированы в компиляторе, компилятор стал бы слишком медленным и, безусловно, пропустил бы большую часть возможных приведений, созданных для пользовательских типов, что является основным НЕТ.

Таким образом, обходной путь состоит в том, что любой объект в C # имеет функцию, унаследованную .ToString (), которая знает, как обрабатывать каждый тип, потому что .ToString () специально кодируется для определенного типа, и, как вы уже догадались, теперь возвращает строку.

В конце концов, тип Int32 - это несколько битов в памяти (32 бита, если быть точным), а тип строки - еще одна куча битов (сколько бит зависит от того, сколько было выделено), компилятор / среда выполнения ничего не знают просто сам смотрю на эти данные до сих пор. Функция .ToString () обращается к определенным метаданным, необходимым для преобразования из одного в другое.

4 голосов
/ 30 января 2009

Поскольку C # не знает, как преобразовать int в строку, библиотека (.ToString) делает.

2 голосов
/ 24 августа 2010

Я только что нашел ответ. ToString отлично работает с переменной int. Вам просто нужно убедиться, что вы добавили скобки.

есть ...

int intMyInt=32;

string strMyString = intMyInt.ToString();
0 голосов
/ 24 августа 2010

VB .net прекрасно способен преобразовывать целые числа в строковые. На самом деле, Java тоже. Почему C # должен иметь проблемы с этим? Иногда необходимо использовать числовое значение в вычислениях, а затем отображать результат в виде строки. Как еще вам удалось бы отобразить результат вычисления в TextBox?

Ответы, приведенные здесь, не имеют смысла. Должен быть способ привести int как строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...