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

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

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

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

C#
1
2
3
        string res = "";
        foreach (int x in marks)
        { res = x + ""; Console.WriteLine(res); }
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.05.2018, 15:35
Ответы с готовыми решениями:

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

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

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

23
171 / 92 / 71
Регистрация: 10.05.2014
Сообщений: 432
21.05.2018, 15:49
Цитата Сообщение от 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
Сообщений: 137
21.05.2018, 16:05  [ТС]
пропустила случайно ToString (),а оно работает...раньше встречала что неявное преобразование типа int в тип string невозможно...или это происходит при конкатенации??? если res = x; то ошибка,а если res = x + ""; то преобразовывает??
0
171 / 92 / 71
Регистрация: 10.05.2014
Сообщений: 432
21.05.2018, 16:19
Лучший ответ Сообщение было отмечено 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
Сообщений: 137
21.05.2018, 16:46  [ТС]
про конкатенацию строк это понятно...и это понятное дело t = v; //Так нельзя преобразовать
но почему t = v + ""; //можно
значит все-таки существует неявное преобразование int в string. Почему в данной строке переменная int v преобразуется в string. Потом происходит конкатенация с "" и получаем string t
0
171 / 92 / 71
Регистрация: 10.05.2014
Сообщений: 432
21.05.2018, 17:35
Цитата Сообщение от IrenaIT Посмотреть сообщение
но почему t = v + ""; //можно
потому что в данном случае интерпретатор вызывает метод ToString() к полю v и, тем самым, преобразует его в строку, далее происходит конкатенация v.ToString() и ""
1
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
22.05.2018, 07:46
Цитата Сообщение от Zodt Посмотреть сообщение
потому что в данном случае интерпретатор вызывает метод ToString() к полю v и, тем самым, преобразует его в строку, далее происходит конкатенация v.ToString() и ""
Не совсем так. Компилятор смотрит, какой тип данных стоит справа от оператора, и интеллектуально принимает решение о преобразовании типа.
1
Эксперт .NET
 Аватар для Usaga
13433 / 8964 / 1324
Регистрация: 21.01.2016
Сообщений: 33,646
22.05.2018, 08:12
Никаких "неявных" преобразований нет. В случае со строкой, вызывается обычный String.Concat(), котоный над каждым аргументом сотворяет ToString().
Миниатюры
Неявное преобразование типов  
1
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
22.05.2018, 09:10
Usaga, что это за божественная хрень, которую Вы заюзали чтобы на лету код в IL смотреть?
Я тоже такую хочу
1
Эксперт .NET
 Аватар для Usaga
13433 / 8964 / 1324
Регистрация: 21.01.2016
Сообщений: 33,646
22.05.2018, 09:11
Woldemar89, это LINQPad.
3
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
22.05.2018, 09:13
Цитата Сообщение от Usaga Посмотреть сообщение
это LINQPad.
Спасибо!
Блин, я же слышал о нем и хотел проверить что это, но о его возможностях не знал, поэтому руки не дошли...
0
22.05.2018, 09:24

Не по теме:

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

0
22.05.2018, 09:27

Не по теме:

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

0
22.05.2018, 09:32

Не по теме:

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

0
22.05.2018, 09:50

Не по теме:

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

0
Эксперт .NET
 Аватар для kolorotur
17812 / 12963 / 3381
Регистрация: 17.09.2011
Сообщений: 21,251
22.05.2018, 10:01
Преобразования, 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
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
22.05.2018, 10:20
Цитата Сообщение от 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
 Аватар для kolorotur
17812 / 12963 / 3381
Регистрация: 17.09.2011
Сообщений: 21,251
22.05.2018, 10:27
Цитата Сообщение от 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
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
22.05.2018, 10:37
Цитата Сообщение от 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
 Аватар для kolorotur
17812 / 12963 / 3381
Регистрация: 17.09.2011
Сообщений: 21,251
22.05.2018, 10:55
Цитата Сообщение от 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.05.2018, 10:55
Помогаю со студенческими работами здесь

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

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

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

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

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


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

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

Новые блоги и статьи
Чем асинхронная логика (схемотехника) лучше тактируемой, как я думаю, что помимо энергоэффективности - ещё и безопасность.
Hrethgir 14.05.2025
Помимо огромного плюса в энергоэффективности, асинхронная логика - тотальный контроль над каждым совершённым тактом, а значит - безусловная безопасность, где безконтрольно не совершится ни одного. . .
Многопоточные приложения на C++
bytestream 14.05.2025
C++ всегда был языком, тесно работающим с железом, и потому особеннно эффективным для многопоточного программирования. Стандарт C++11 произвёл революцию, добавив в язык нативную поддержку потоков,. . .
Stack, Queue и Hashtable в C#
UnmanagedCoder 14.05.2025
Каждый опытный разработчик наверняка сталкивался с ситуацией, когда невинный на первый взгляд List<T> превращался в узкое горлышко всего приложения. Причина проста: универсальность – это прекрасно,. . .
Как использовать OAuth2 со Spring Security в Java
Javaican 14.05.2025
Протокол OAuth2 часто путают с механизмами аутентификации, хотя по сути это протокол авторизации. Представьте, что вместо передачи ключей от всего дома вашему другу, который пришёл полить цветы, вы. . .
Анализ текста на Python с NLTK и Spacy
AI_Generated 14.05.2025
NLTK, старожил в мире обработки естественного языка на Python, содержит богатейшую коллекцию алгоритмов и готовых моделей. Эта библиотека отлично подходит для образовательных целей и. . .
Реализация DI в PHP
Jason-Webb 13.05.2025
Когда я начинал писать свой первый крупный PHP-проект, моя архитектура напоминала запутаный клубок спагетти. Классы создавали другие классы внутри себя, зависимости жостко прописывались в коде, а о. . .
Обработка изображений в реальном времени на C# с OpenCV
stackOverflow 13.05.2025
Объединение библиотеки компьютерного зрения OpenCV с современным языком программирования C# создаёт симбиоз, который открывает доступ к впечатляющему набору возможностей. Ключевое преимущество этого. . .
POCO, ACE, Loki и другие продвинутые C++ библиотеки
NullReferenced 13.05.2025
В C++ разработки существует такое обилие библиотек, что порой кажется, будто ты заблудился в дремучем лесу. И среди этого многообразия POCO (Portable Components) – как маяк для тех, кто ищет. . .
Паттерны проектирования GoF на C#
UnmanagedCoder 13.05.2025
Вы наверняка сталкивались с ситуациями, когда код разрастается до неприличных размеров, а его поддержка становится настоящим испытанием. Именно в такие моменты на помощь приходят паттерны Gang of. . .
Создаем CLI приложение на Python с Prompt Toolkit
py-thonny 13.05.2025
Современные командные интерфейсы давно перестали быть черно-белыми текстовыми программами, которые многие помнят по старым операционным системам. CLI сегодня – это мощные, интуитивные и даже. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru