Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> неявное преобразование int в string 
V
    Опции темы
gambit
Дата 26.2.2010, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***
Награды: 1



Профиль
Группа: Комодератор
Сообщений: 1359
Регистрация: 25.6.2006
Где: я?

Репутация: 5
Всего: 40



Добрый день.
Заинтересовал такой вопрос, почему вариант
Код

int i = 5;
string s = "Привет " + i;

работает, а вариант
Код

int i = 5;
string s = i;

нет.

Из каких побуждений могли разрешить первый вариант и запретить второй?
PM MAIL ICQ Skype   Вверх
Kano
Дата 26.2.2010, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 95
Регистрация: 23.2.2009

Репутация: нет
Всего: 0



Цитата(gambit @  26.2.2010,  23:12 Найти цитируемый пост)
Из каких побуждений могли разрешить первый вариант и запретить второй? 

— из тех, что оператор "=" не может быть перегружен, а "+" — может, думаю.
PM MAIL   Вверх
gambit
Дата 26.2.2010, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***
Награды: 1



Профиль
Группа: Комодератор
Сообщений: 1359
Регистрация: 25.6.2006
Где: я?

Репутация: 5
Всего: 40



Цитата(Kano @  26.2.2010,  23:45 Найти цитируемый пост)
— из тех, что оператор "=" не может быть перегружен, а "+" — может, думаю. 

ответ вообще не в тему.
вопрос не в синтаксисе, а почему эту возможность не вложили.

Это сообщение отредактировал(а) gambit - 27.2.2010, 00:14
PM MAIL ICQ Skype   Вверх
NightmareZ
Дата 27.2.2010, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


[хакер]
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 10.8.2006

Репутация: 2
Всего: 13



Цитата(gambit @ 26.2.2010,  23:12)
Добрый день.
Заинтересовал такой вопрос, почему вариант
Код

int i = 5;
string s = "Привет " + i;

работает, а вариант
Код

int i = 5;
string s = i;

нет.

Из каких побуждений могли разрешить первый вариант и запретить второй?

Первый вариант работает, потому что оператор "+" для строки перегружен. Типа
Код

class String
{
   // ...
   public static string operator +(string s, int i)
   {
      return string.Concat(s, i.ToString());
   }
   // ...
}

Для того, чтобы допустим был второй вариант, нужно чтобы было определено implicit-преобразование из int в string. Типа
Код

class String
{
   // ...
   public static implicit operator string(int i)
   {
      return i.ToString();
   }
   // ...
}

Но этого не сделали. Потому что просто так.


--------------------
NightmareZ.net - мой блог и сайт, мои проекты и прочий трэш
Ely-Art.ru - наша маленькая домашняя арт-студия
mugcraft.ru - кружки на любой вкус
PM WWW ICQ Skype GTalk AOL YIM   Вверх
CYBERDREAM
Дата 27.2.2010, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

Репутация: 11
Всего: 28



Из соображений оптимизации скорее всего, но каких... Надо спросить на форуме майкрософт)


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
NightmareZ
Дата 27.2.2010, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


[хакер]
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 10.8.2006

Репутация: 2
Всего: 13



Цитата(CYBERDREAM @ 27.2.2010,  00:07)
Из соображений оптимизации скорее всего, но каких... Надо спросить на форуме майкрософт)

Никаких там оптимизаций нет и быть не может.


--------------------
NightmareZ.net - мой блог и сайт, мои проекты и прочий трэш
Ely-Art.ru - наша маленькая домашняя арт-студия
mugcraft.ru - кружки на любой вкус
PM WWW ICQ Skype GTalk AOL YIM   Вверх
gambit
Дата 27.2.2010, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***
Награды: 1



Профиль
Группа: Комодератор
Сообщений: 1359
Регистрация: 25.6.2006
Где: я?

Репутация: 5
Всего: 40



Цитата(NightmareZ @  27.2.2010,  00:05 Найти цитируемый пост)
Но этого не сделали. Потому что просто так. 

Просто так, даже мухи не....

Цитата(NightmareZ @  27.2.2010,  00:08 Найти цитируемый пост)
Никаких там оптимизаций нет и быть не может. 

почему?

Цитата(NightmareZ @  27.2.2010,  00:05 Найти цитируемый пост)
Первый вариант работает, потому что оператор "+" для строки перегружен. Типа

это реальный код платформы .net, или полет вашей фантазии?
PM MAIL ICQ Skype   Вверх
NightmareZ
Дата 27.2.2010, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


[хакер]
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 10.8.2006

Репутация: 2
Всего: 13



Цитата(gambit @  27.2.2010,  00:13 Найти цитируемый пост)
Просто так, даже мухи не....

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

Цитата(gambit @  27.2.2010,  00:13 Найти цитируемый пост)
почему?

Потому что негде. Это же очевидно.

Цитата(gambit @  27.2.2010,  00:13 Найти цитируемый пост)
то реальный код платформы .net, или полет вашей фантазии?

Это реальный код. Хочешь я тебе напишу класс CoolString, для которого и первый и второй вариант будет работать + он будет полностью совместим со стандартным string'ом.


--------------------
NightmareZ.net - мой блог и сайт, мои проекты и прочий трэш
Ely-Art.ru - наша маленькая домашняя арт-студия
mugcraft.ru - кружки на любой вкус
PM WWW ICQ Skype GTalk AOL YIM   Вверх
gambit
Дата 27.2.2010, 00:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***
Награды: 1



Профиль
Группа: Комодератор
Сообщений: 1359
Регистрация: 25.6.2006
Где: я?

Репутация: 5
Всего: 40



А почему такую весчь не реализовали путем неявного приведения? Ведь int всегда приведется к стрингу?

Добавлено через 5 минут и 14 секунд
Цитата(NightmareZ @  27.2.2010,  00:19 Найти цитируемый пост)
Это реальный код

а где ниб в рефлекторе его можно найти, а то я что то невижу(((
PM MAIL ICQ Skype   Вверх
NightmareZ
Дата 27.2.2010, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


[хакер]
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 10.8.2006

Репутация: 2
Всего: 13



Цитата(gambit @ 27.2.2010,  00:22)
А почему такую весчь не реализовали путем неявного приведения? Ведь int всегда приведется к стрингу?

Потому что сейчас можно неявно привести int к string, но нельзя неявно привести string к int. Если бы были возможны оба преобразования, то как разрулить такой код
Код

string s = "Hello ";
int i = 10;

Console.WriteLine(s + i); // ????  (int)s + i  или  s + (string)i   ????


Добавлено через 3 минуты и 24 секунды
Цитата(gambit @  27.2.2010,  00:22 Найти цитируемый пост)
а где ниб в рефлекторе его можно найти, а то я что то невижу(((

А чёрт его знает.... может он вообще нативный  smile 


--------------------
NightmareZ.net - мой блог и сайт, мои проекты и прочий трэш
Ely-Art.ru - наша маленькая домашняя арт-студия
mugcraft.ru - кружки на любой вкус
PM WWW ICQ Skype GTalk AOL YIM   Вверх
gambit
Дата 27.2.2010, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***
Награды: 1



Профиль
Группа: Комодератор
Сообщений: 1359
Регистрация: 25.6.2006
Где: я?

Репутация: 5
Всего: 40



Цитата(NightmareZ @  27.2.2010,  00:33 Найти цитируемый пост)
Потому что сейчас можно неявно привести int к string, но нельзя неявно привести string к int.

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

мы можем родителя привести к потомку, но не потомка к родителю.
мы можем int привести к int64, но не наоборот.


Цитата(NightmareZ @  27.2.2010,  00:19 Найти цитируемый пост)
Это реальный код.

так вы и не колитесь, где же вы его нашли, если он реальный.

кроме того если тот код реален, то как вы объясните это???
Код

int i = 7;
string s = "" + i + "";
s = i + "";
s = "" + i + "" + i + i + "";


что в классе string знак + перегружен для всех возможных вариантов???
PM MAIL ICQ Skype   Вверх
NightmareZ
Дата 27.2.2010, 00:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


[хакер]
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 10.8.2006

Репутация: 2
Всего: 13



Цитата(gambit @  27.2.2010,  00:44 Найти цитируемый пост)
а причем здесь это? неявное приведение всегда только в одну сторону.мы можем родителя привести к потомку, но не потомка к родителю.мы можем int привести к int64, но не наоборот.


Парень, да ты упоротый и ничего в теме не понимаешь, потому глупые вопросы.... дык, ты ещё и спорить пытаешься. Неявное приведение работает так, как мы того хотим (или как того хотят люди, которые создали типы данных, которыми мы пользуемся).

 ! 
PashaPash
+10%

Вот класс. Можно его привести к int, и можно int привести к нему.... неявно.

Код

class MyType
{
    string _innerString;

    public MyType(int i)
    {
        _innerString = i.ToString();
    }

    public static implicit operator MyType(int i)
    {
        return new MyType(i);
    }

    public static implicit operator int(MyType m)
    {
        return int.Parse(m._innerString);
    }
}


Смотрим:
Код

MyType x = 10;
int i = x;

Работает!

Цитата(gambit @  27.2.2010,  00:44 Найти цитируемый пост)
так вы и не колитесь, где же вы его нашли, если он реальный.

Как где? Написал! Не веришь, что он реальный - скомпилируй и запусти.

Цитата(gambit @  27.2.2010,  00:44 Найти цитируемый пост)
что в классе string знак + перегружен для всех возможных вариантов???

В данном конкретном примере есть только неявное преобразование из string в int.


Это сообщение отредактировал(а) PashaPash - 27.2.2010, 02:53


--------------------
NightmareZ.net - мой блог и сайт, мои проекты и прочий трэш
Ely-Art.ru - наша маленькая домашняя арт-студия
mugcraft.ru - кружки на любой вкус
PM WWW ICQ Skype GTalk AOL YIM   Вверх
Любитель
Дата 27.2.2010, 00:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 11
Всего: 92



Да ничего там не перегружено. Это фича на уровне компилятора. Вызывается String.Concat (который принимает обжекты).

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

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


--------------------
PM MAIL ICQ Skype   Вверх
NightmareZ
Дата 27.2.2010, 01:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


[хакер]
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 10.8.2006

Репутация: 2
Всего: 13



Цитата(Любитель @  27.2.2010,  00:57 Найти цитируемый пост)
Да ничего там не перегружено. Это фича на уровне компилятора.

А это уже непринципиально, разруливает ли это компилятор или рантайм. В термах же языка это именно перегрузка оператора.

Цитата(Любитель @  27.2.2010,  00:57 Найти цитируемый пост)
Почему нельзя присваивать инты стрингам? ИМХО, решили, что это может привести к лишним случайным ошибкам (ну т. е. тот случай когда лишняя "неявность" - это плохо).

Посмотри выше про неоднозначность Console.WriteLine(s + i);

Добавлено через 1 минуту и 17 секунд
Цитата(Любитель @  27.2.2010,  00:57 Найти цитируемый пост)
Ну и для параноиков - надо вызывать ToString, который возовет Int32.ToString, а не пользоваться конкатом, примающим обжекты и, как следствие, вызывающий боксинг числа (о, ужас - это ж дикие затраты!).

Если ты о моём примере, то там int сначала преобразуется в string, а уже потом вызывается перегруженная версия Concat, которая принимает два параметра string.


--------------------
NightmareZ.net - мой блог и сайт, мои проекты и прочий трэш
Ely-Art.ru - наша маленькая домашняя арт-студия
mugcraft.ru - кружки на любой вкус
PM WWW ICQ Skype GTalk AOL YIM   Вверх
Любитель
Дата 27.2.2010, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 11
Всего: 92



Цитата(NightmareZ @  27.2.2010,  01:01 Найти цитируемый пост)

Посмотри выше про неоднозначность Console.WriteLine(s + i);

Эээ.. неявно получать из строки число - это очевидно плохо. Обратное - спорно. Хотя я за то, чтобы нельзя было неявно ни туда, ни сюда smile

Добавлено через 1 минуту и 35 секунд
Цитата(NightmareZ @  27.2.2010,  01:01 Найти цитируемый пост)
Если ты о моём примере, то там int сначала преобразуется в string, а уже потом вызывается перегруженная версия Concat, которая принимает два параметра string.

В каком? С райт-лайном? Предполагаю, что там боксится i, а затем вызывается Concat.

Добавлено через 3 минуты и 56 секунд
И.. если придираться. Пример с якобы перегруженным оператором + (ок, детали реализации неважны, смотрим результат) неверен. Как раз прямое использование + (без вызова ToString ведёт к боксингу и Concat-у с обжектами. А вызов ToString - к Int32.ToString + конкат со стрингами.


--------------------
PM MAIL ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0572 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.