Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > неявное преобразование int в string


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

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

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

int i = 5;
string s = i;

нет.

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

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

— из тех, что оператор "=" не может быть перегружен, а "+" — может, думаю.

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

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

Автор: NightmareZ 27.2.2010, 00:05
Цитата(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();
   }
   // ...
}

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

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

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

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

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

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

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

почему?

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

это реальный код платформы .net, или полет вашей фантазии?

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

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

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

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

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

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

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

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

а где ниб в рефлекторе его можно найти, а то я что то невижу(((

Автор: NightmareZ 27.2.2010, 00:33
Цитата(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 

Автор: gambit 27.2.2010, 00:44
Цитата(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 знак + перегружен для всех возможных вариантов???

Автор: NightmareZ 27.2.2010, 00:54
Цитата(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.

Автор: Любитель 27.2.2010, 00:57
Да ничего там не перегружено. Это фича на уровне компилятора. Вызывается String.Concat (который принимает обжекты).

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

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

Автор: NightmareZ 27.2.2010, 01:01
Цитата(Любитель @  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.

Автор: Любитель 27.2.2010, 01:05
Цитата(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 + конкат со стрингами.

Автор: gambit 27.2.2010, 01:11
Цитата(NightmareZ @  27.2.2010,  00:54 Найти цитируемый пост)
Как где? Написал! 

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

и вы умудрились ответить неверно и ввести меня в заблуждение.

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

единственный достойный ответ во всей ветке.

Цитата(NightmareZ @  27.2.2010,  01:01 Найти цитируемый пост)
Посмотри выше про неоднозначность Console.WriteLine(s + i); 

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

Цитата(NightmareZ @  27.2.2010,  00:54 Найти цитируемый пост)
Парень, да ты упоротый и ничего в теме не понимаешь, потому глупые вопросы

такого обращения к себе не потерплю, до вашего уровня спускаться не буду, по этому грубости в ответ не будет, просто тема закрыта, вопрос решен.

Автор: PashaPash 27.2.2010, 02:50
NightmareZ, интересно, что такое "перегруженный оператор в терминах языка". Любитель прав почти полностью. Даже насчет боксинга. Дальнейший спор с упоминанием "терминов языка" и намеками на укуренность оппонента будет признан флеймом smile

Автор: Kano 27.2.2010, 02:58
Цитата(gambit @  27.2.2010,  01:11 Найти цитируемый пост)
единственный достойный ответ во всей ветке

— так тебя же не это интересовало?

Цитата(gambit @  27.2.2010,  01:11 Найти цитируемый пост)
понятно что присоеденить число к строке можно только приведением числа к строке

— это только потому, что авторы языка так захотели. Это не является очевидным. В PHP, к примеру, наборот: $strValue + $intValue даст integer.

Автор: Любитель 27.2.2010, 03:03
Цитата(PashaPash @  27.2.2010,  02:50 Найти цитируемый пост)
Любитель прав почти полностью.

Хм. А где не прав?

Автор: PashaPash 27.2.2010, 03:06
Цитата(Kano @  27.2.2010,  02:58 Найти цитируемый пост)
— это только потому, что авторы языка так захотели. Это не является очевидным. В PHP, к примеру, наборот: $strValue + $intValue даст integer. 

Скорее, это потому что в .NET/C# вообще все что угодно можно представить в строковом виде. То, что вопрос задан именно про int - случайность. 

Цитата(Любитель @  27.2.2010,  03:03 Найти цитируемый пост)
Хм. А где не прав? 

Это специально, чтобы подстегнуть интерес к теме. И обеспечить тебе бессонную ночь smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)