приведение типов в c # .net - PullRequest
       80

приведение типов в c # .net

1 голос
/ 27 февраля 2012

Я хочу знать, приведение типов в c # .net, у меня ниже строки кода.

int i=4
object o = i // This works properly without any typecasting becausing boxing takes place automatically
string s= i // This does not work, even when the string is also reference type?
string s=(string)i //This also does not work even if i try to typecast the int to string.
string s= Convert.ToString(i); // this works.

, поэтому я хочу знать, почему string s = i and string s = (string)i не работает и в чем разница с использованием (string)i, i.ToString(), and Convert.ToString(i).

Ответы [ 9 ]

3 голосов
/ 27 февраля 2012

Когда дело доходит до упаковки и распаковки, типы имеют явное и неявное приведение типов.Таким образом, в некоторых случаях для среды выполнения достаточно просто разрешить неявное преобразование между двумя поддерживаемыми типами, скажем, Int32 в Double.Однако не существует явного или явного преобразования между целым числом и строкой, поскольку очевидно, что строка не является целым числом (несмотря на то, что строка может содержать символы для целого числа).

string s = i; // attempt at implicit cast from Int32 to String, error
object o = i; // all types inherit from Object, so you may implicitly or explicitly cast from Int32 to Object.
s = (string)i; // attempt at explicit cast from Int32 to string, error
s = i.ToString(); // conversion
s = Convert.ToString(i); // conversion

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

0 голосов
/ 27 февраля 2012

Типизация в C # работает только в соответствии с наследованием классов.Объект является корнем всех типов в C #, и поэтому все значения могут быть переданы ему по типу.

string и int не разделяют одну и ту же ветвь наследования и поэтому не могут быть напрямую преобразованы из одного вДругой.

Convert.ToString() - это метод, предназначенный для преобразования целого числа в строку - здесь не выполняется приведение типов, просто выполняется метод, предназначенный для преобразования целого числа в строковое представление.

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

Последнее замечание: исключения из правил приведения типов могут быть включеныразработчику с помощью метода public static explicit operator, который позволяет разработчику преобразовывать одно значение в другое по своему усмотрению.

0 голосов
/ 27 февраля 2012

Первое, что следует отметить, это то, что каждый класс наследуется от объекта.

Приведение int к объекту использует Int32.

Приведение строки к объекту использует String.

Не существует неявного приведения из целого числа в строку, потому что они находятся в разных частях иерархии классов - одно никак не связано с другим.Тем не менее, поскольку string используется так часто для выходного объекта (и, следовательно, для всех его дочерних элементов), для удобства имеется метод ToString ().

Однако Convert написан специально для возможности преобразования, например, из одного типа в другой.Convert.ToBool (x) может анализировать "true" или "false" в логическое значение, и, как вы показали, он может преобразовывать целое число в строку - опять же, это действительно удобство, которое, вероятно, просто вызывает Int32.ToString () изнутри..

0 голосов
/ 27 февраля 2012

поэтому я хочу знать, почему string s = i и string s = (string)i не работают

Короткий ответ: нет ни явного (первый пример выше), ни явного (второй пример выше) преобразования из int в заданную строку. Чуть более длинный ответ; при создании структуры Int32 в C # не было запрограммировано поведение приведения, позволяющее разработчику автоматически приводить из int к строке

Какая разница в использовании (string)i, i.ToString() и Convert.ToString(i)

Ну, первое не работает, как вы сказали, и как я объяснил выше. Второй вызывает метод ToString в структуре Int32, которая возвращает (как следует из названия) строковое представление объекта. Следует отметить, что это совершенно новая строка, никак не связанная с первоначальной ценностью. Третий пример Convert.ToString будет вызывать изнутри любой наиболее подходящий способ превратить передаваемый параметр в строку - скорее всего, просто вызывает метод ToString - так что он в значительной степени идентичен примеру 2.

0 голосов
/ 27 февраля 2012

string s= i не работает, потому что типы не совпадают, int не будет помещаться в строку.

string s=(string)i не работает, потому что не может определить, какое преобразование типа должно использоваться (то есть, какая база)

что-то вроде s = ""+i будет работать с другой стороны, так как оно будет преобразовывать основание 10.

0 голосов
/ 27 февраля 2012

Вы можете указать неявные и явные преобразования в .net, причина того, что строка s = i завершается неудачей, заключается в том, что нет встроенной операции приведения целого числа к строке.

см. статью MSDN о кастинге для получения дополнительной информации

0 голосов
/ 27 февраля 2012

строка s = i и строка s = (строка) i не работает

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

В чем разница в использовании (строка) i, i.ToString () и Convert.ToString (i).

  • (строка) i: приведение i к строке должно быть назначаемым.

  • i.ToString (): вызывает метод ToSstring, который не зависит от System.object и, таким образом, доступен для ВСЕХ классов и структур - но не возвращает разумного содержимого, если не перезаписан.

  • Convert.ToString (i): преобразует i в строку.Это включает в себя вызов конвертера, который, вероятно, просто вызывает ToString в этом редком случае.

В конце концов, приведение не является переводом.чтобы (строка) i работала, я ДОЛЖЕН БЫТЬ СТРОКОЙ, в то время как convert пытается сделать ее строкой.

0 голосов
/ 27 февраля 2012

Ну, string и object - оба они являются ссылочными типами.Однако object является корневым типом для всех типов .NET.

Когда вы используете такой синтаксис, как (string)i, вы пытаетесь использовать явное преобразование между типами.Но этот тип преобразования требует, чтобы класс string знал обо всех возможных типах аргументов.

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

0 голосов
/ 27 февраля 2012

ToString() метод переопределяется каждой ссылкой, которая является жизненно важным методом в классе объекта.string calss переопределяет этот метод и предоставляет из него строковое значение.

Реализация по умолчанию метода ToString возвращает полное имя типа объекта, как показано в следующем примере.

 Object obj = new Object();
      Console.WriteLine(obj.ToString());

// The example displays the following output:
//      System.Object

это поведение наследуется ссылочными типами, которые не переопределяют метод ToString.

...