27 / 0 / 1
Регистрация: 01.06.2017
Сообщений: 133
1

Неявное преобразование типов

21.05.2018, 15:35. Показов 4659. Ответов 23
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В данном коде неявное преобразование из int в string?

C#
1
2
3
        string res = "";
        foreach (int x in marks)
        { res = x + ""; Console.WriteLine(res); }
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.05.2018, 15:35
Ответы с готовыми решениями:

Неявное преобразование типов
Здравствуйте, помогите, пожалуйста, разобраться с такой вещью. Есть задание - Определить класс...

Неявное преобразование типов в C#
Почему данная программа верна и нет ошибок, ведь тип long больше типа float. Как так можно 8 байт...

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

Неявное приведение типов - ошибка в коде
Прога ругается, на то что может приобразовать double в int, хотя везде указывал int Ошибка 1 Не...

23
170 / 91 / 71
Регистрация: 10.05.2014
Сообщений: 432
21.05.2018, 15:49 2
Цитата Сообщение от IrenaIT Посмотреть сообщение
В данном коде неявное преобразование из int в string?
Да. Самый простой способ проверки

C#
1
2
3
4
string r = "";
int a = 5;
 
Console.WriteLine((r+a).GetType());

Не по теме:

И не проще ли использовать .ToString()?

1
27 / 0 / 1
Регистрация: 01.06.2017
Сообщений: 133
21.05.2018, 16:05  [ТС] 3
пропустила случайно ToString (),а оно работает...раньше встречала что неявное преобразование типа int в тип string невозможно...или это происходит при конкатенации??? если res = x; то ошибка,а если res = x + ""; то преобразовывает??
0
170 / 91 / 71
Регистрация: 10.05.2014
Сообщений: 432
21.05.2018, 16:19 4
Лучший ответ Сообщение было отмечено IrenaIT как решение

Решение

Цитата Сообщение от IrenaIT Посмотреть сообщение
раньше встречала что неявное преобразование типа int в тип string невозможно
ну правильно.
C#
1
2
3
4
5
6
7
8
9
10
11
12
int v = default(int);
string t = default(string);
 
v = t; //Так нельзя преобразовать
v = (int) t; //И даже так нельзя
v = int.Parse(t); //Так можно, если строка состоит исключительно из цифр
int.TryParse(t, out v); //аналог предыдущей строки, возвращающий булево значение - true/false,
// очень полезно при работе с условными операторами
 
t = v; //Так нельзя преобразовать
t = (string)v; //Тоже нельзя
t = v.ToString(); //Можно
Цитата Сообщение от IrenaIT Посмотреть сообщение
или это происходит при конкатенации???
Самый простой способ понять - прочитать здесь
0
27 / 0 / 1
Регистрация: 01.06.2017
Сообщений: 133
21.05.2018, 16:46  [ТС] 5
про конкатенацию строк это понятно...и это понятное дело t = v; //Так нельзя преобразовать
но почему t = v + ""; //можно
значит все-таки существует неявное преобразование int в string. Почему в данной строке переменная int v преобразуется в string. Потом происходит конкатенация с "" и получаем string t
0
170 / 91 / 71
Регистрация: 10.05.2014
Сообщений: 432
21.05.2018, 17:35 6
Цитата Сообщение от IrenaIT Посмотреть сообщение
но почему t = v + ""; //можно
потому что в данном случае интерпретатор вызывает метод ToString() к полю v и, тем самым, преобразует его в строку, далее происходит конкатенация v.ToString() и ""
1
управление сложностью
1689 / 1302 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
22.05.2018, 07:46 7
Цитата Сообщение от Zodt Посмотреть сообщение
потому что в данном случае интерпретатор вызывает метод ToString() к полю v и, тем самым, преобразует его в строку, далее происходит конкатенация v.ToString() и ""
Не совсем так. Компилятор смотрит, какой тип данных стоит справа от оператора, и интеллектуально принимает решение о преобразовании типа.
1
Эксперт .NET
12218 / 8569 / 1298
Регистрация: 21.01.2016
Сообщений: 32,192
22.05.2018, 08:12 8
Никаких "неявных" преобразований нет. В случае со строкой, вызывается обычный String.Concat(), котоный над каждым аргументом сотворяет ToString().
Миниатюры
Неявное преобразование типов  
1
TheGreatCornholio
1254 / 732 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
22.05.2018, 09:10 9
Usaga, что это за божественная хрень, которую Вы заюзали чтобы на лету код в IL смотреть?
Я тоже такую хочу
1
Эксперт .NET
12218 / 8569 / 1298
Регистрация: 21.01.2016
Сообщений: 32,192
22.05.2018, 09:11 10
Woldemar89, это LINQPad.
3
TheGreatCornholio
1254 / 732 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
22.05.2018, 09:13 11
Цитата Сообщение от Usaga Посмотреть сообщение
это LINQPad.
Спасибо!
Блин, я же слышал о нем и хотел проверить что это, но о его возможностях не знал, поэтому руки не дошли...
0
Zodt
22.05.2018, 09:24
  #12

Не по теме:

Usaga, прям плюсую за такую, реально божественно-годную хрень!

0
Usaga
22.05.2018, 09:27
  #13

Не по теме:

Ёшки кот! Я думал, что про эту штуковину почти все знают)

0
Woldemar89
22.05.2018, 09:32
  #14

Не по теме:

Цитата Сообщение от Usaga Посмотреть сообщение
Ёшки кот! Я думал, что про эту штуковину почти все знают)
Ну я знал, мб даже где-то в закладках лежит, и что толку?)
Я думал это хрень какая то с 1-2 фичами для linq - типа потом гляну, и вот, неск лет прошло - пожалуйста - взглянул :(
Теперь жалею, что раньше не заюзал...

0
Zodt
22.05.2018, 09:50
  #15

Не по теме:

Usaga, дело в том, что я тоже слышал, но думал она чисто как аналог VS, а тут такое приятное действо оказалось=)

0
Эксперт .NET
17751 / 12906 / 3374
Регистрация: 17.09.2011
Сообщений: 21,181
22.05.2018, 10:01 16
Преобразования, IL-код...
Давайте уже начнем происходящее в программе, написанной на определенном языке, объяснять правилами этого языка, а не декомпилированными инструкциями.
А то так ведь можно договориться до того, что данное поведение наблюдается потому, что это компилятор так скомпилировал. То есть зависит от компилятора.
Оператор — это метод; при использовании оператора производится обычное определение наиболее подходящей перегрузки.
В примере x + "" левый аргумент — int, правый — string.
В типе int нет перегрузок оператора int с параметром string или object, а вот в классе string есть такие перегрузки:
C#
1
2
3
string operator +(string a, string b);
string operator +(string a, object b);
string operator +(object a, string b);
int неявно преобразуется в object, потому используется последняя перегрузка (что, кстати, приводит к запаковке), в которой уже вызывается ToString на первом параметре.
0
TheGreatCornholio
1254 / 732 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
22.05.2018, 10:20 17
Цитата Сообщение от kolorotur Посмотреть сообщение
Давайте уже начнем происходящее в программе, написанной на определенном языке, объяснять правилами этого языка, а не декомпилированными инструкциями.
А давайте объединим эти 2 подхода?

string все таки алиас System.String

https://referencesource.micros... /string.cs

И string operator + там я не вижу.

В Visual Studio тоже. Там 11 перегрузок Concat и ни одной string operator + (см. скриншот)

А насчет упаковки, в IL есть инструкция box System.Int32, те, по видимому, здесь используется

перегрузка public static String Concat(object arg0, object arg1);,

где int упаковывается в object (как Вы и указывали), а вот string, видимо, нет, тк нет необходимости.
Миниатюры
Неявное преобразование типов   Неявное преобразование типов  
0
Эксперт .NET
17751 / 12906 / 3374
Регистрация: 17.09.2011
Сообщений: 21,181
22.05.2018, 10:27 18
Цитата Сообщение от Woldemar89 Посмотреть сообщение
А давайте объединим эти 2 подхода?
Ну вот вы попробовали — и как результат?

Цитата Сообщение от Woldemar89 Посмотреть сообщение
string все таки алиас System.String
https://referencesource.micros... /string.cs
И string operator + там я не вижу.
Вот именно.
Потому возвращаемся к правилам языка, то есть к спеку:
7.8.4 Addition operator
...
String concatenation:
C#
1
2
3
string operator +(string x, string y);
string operator +(string x, object y);
string operator +(object x, string y);
These overloads of the binary + operator perform string concatenation. If an operand of string concatenation is null, an empty string is substituted. Otherwise, any non-string argument is converted to its string representation by invoking the virtual ToString method inherited from type object. If ToString returns null, an empty string is substituted.
0
TheGreatCornholio
1254 / 732 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
22.05.2018, 10:37 19
Цитата Сообщение от kolorotur Посмотреть сообщение
Ну вот вы попробовали — и как результат?
По мне, так все логично
Цитата Сообщение от kolorotur Посмотреть сообщение
any non-string argument is converted to its string representation by invoking the virtual ToString method inherited from type object
См. скриншот, да именно так.

Те получается, сначала запаковка int, потом вызов Concat
(о чем нам кстати IL рассказал вполне доходчиво )

Цитата Сообщение от kolorotur Посмотреть сообщение
а вот в классе string есть такие перегрузки
Я их не вижу, наверно, Вас попутала спецификация, которая якобы указывает что они есть.
Ну или меня пиво попутало
Миниатюры
Неявное преобразование типов  
0
Эксперт .NET
17751 / 12906 / 3374
Регистрация: 17.09.2011
Сообщений: 21,181
22.05.2018, 10:55 20
Цитата Сообщение от Woldemar89 Посмотреть сообщение
По мне, так все логично
Как же логично, если в просматриваемом коде нет перегрузок, а на деле они выполняются?

Цитата Сообщение от Woldemar89 Посмотреть сообщение
Те получается, сначала запаковка int, потом вызов Concat
Там не идет речи о вызове метода Concat.
Как производится слияние строк — деталь реализации.

Цитата Сообщение от Woldemar89 Посмотреть сообщение
о чем нам кстати IL рассказал вполне доходчиво
Так если нормально знать правила языка, то эти нюансы можно видеть сразу в коде, а не при просмотре инструкций.

Цитата Сообщение от Woldemar89 Посмотреть сообщение
Я их не вижу, наверно, Вас попутала спецификация, которая якобы указывает что они есть.
Вот поэтому я всегда настоятельно рекомендую не учить происходящее в язке, смотря в исходники.
А то там ведь можно увидеть и такое:
C#
1
2
3
    public struct Int32 : IComparable, IFormattable, IConvertible, IComparable<Int32>, IEquatable<Int32>
    {
        internal int m_value;
Вот и объясните с помощью исходников, как такое возможно, если int — это алиас для System.Int32.
Более того, просматривая код того же Int32, вы нигде не увидите арифметических операторов. А ведь они есть.

Исходники бывают полезны, если интересно как реализовано то или иное, но использовать их в качестве источника знаний о правилах языка — мягко говоря, не лучшая идея.
0
22.05.2018, 10:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.05.2018, 10:55
Помогаю со студенческими работами здесь

Быстрое преобразование Фурье и ошибка "Неявное преобразование типа"
А подскажите еще по одной прблемке: Есть программа реализующая БПФ (ну должна по крайней мере это...

Неявное преобразование
Привет! Возникла небольшая проблема, может даже не много детская с неявным преобразованием, но...

Неявное преобразование
Расскажите как в компьютере происходит неявное преобразование кто делает это преобразование для...

Неявное преобразование к int
Есть класс с полем типа object. При присваивании происходит неявное преобразование к int`у, можно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru