Вопрос

Я хочу знать приведение типов в С#.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).

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

Решение

Когда дело доходит до упаковки и распаковки, типы имеют явное и неявное приведение.Таким образом, в некоторых случаях среде выполнения достаточно легко разрешить неявное преобразование между двумя поддерживаемыми типами, скажем, 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 предоставляет некоторые параметры форматирования).

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

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

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

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

Строка s= i и string s= (строка) я не работаю

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

Что такое разница в использовании (строка) i, i.tostring () и конвертации.tostring (i).

    .
  • (string) I: ztive i в строку, должна быть присвоена.

  • i.tostring (): вызывает метод TosString, который является дефореным на System.Object, что доступно на всех классах и структурах - но возвращает разумный контент, если не перезаписывается.

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

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

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

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

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

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

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

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

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

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

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

Метод «P> ToString()» переопределяется каждым видом на видимый способ в классе объекта.String Calss переопределяют этот метод и предоставляют строковое значение из этого.

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

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

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

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

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

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

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

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

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

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

Литья int incount, использует int32.

Строка отливки к объекту использует строку.

Нет неявного отличия из целого числа к строке, потому что они находятся в разных частях классовой иерархии - никоим образом не относится к другому.Однако потому, что строка используется так часто для выходного объекта (и, следовательно, все его дети) имеют метод TOSTRING () для удобства.

Однако преобразование написано специально для того, чтобы иметь возможность преобразовать из одного типа на другой, например конвертировать .tobool (x) может проанализировать «true» или «false» в логическое значение, и, как вы показали, он может преобразовать целое числоСтрока - опять это действительно удобное, что, вероятно, просто вызывает int32.tostring () под капотом.

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