![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| gambit |
|
||||
![]() Эксперт ![]() ![]() ![]() Награды: 1 Профиль Группа: Комодератор Сообщений: 1359 Регистрация: 25.6.2006 Где: я? Репутация: 5 Всего: 40 |
Добрый день.
Заинтересовал такой вопрос, почему вариант
работает, а вариант
нет. Из каких побуждений могли разрешить первый вариант и запретить второй? |
||||
|
|||||
| Kano |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 95 Регистрация: 23.2.2009 Репутация: нет Всего: 0 |
||||
|
||||
| gambit |
|
|||
![]() Эксперт ![]() ![]() ![]() Награды: 1 Профиль Группа: Комодератор Сообщений: 1359 Регистрация: 25.6.2006 Где: я? Репутация: 5 Всего: 40 |
||||
|
||||
| NightmareZ |
|
||||||||||
![]() [хакер] ![]() ![]() Профиль Группа: Участник Сообщений: 699 Регистрация: 10.8.2006 Репутация: 2 Всего: 13 |
Первый вариант работает, потому что оператор "+" для строки перегружен. Типа
Для того, чтобы допустим был второй вариант, нужно чтобы было определено implicit-преобразование из int в string. Типа
Но этого не сделали. Потому что просто так. -------------------- NightmareZ.net - мой блог и сайт, мои проекты и прочий трэш Ely-Art.ru - наша маленькая домашняя арт-студия mugcraft.ru - кружки на любой вкус |
||||||||||
|
|||||||||||
| CYBERDREAM |
|
|||
![]() I think, there4 I am ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1096 Регистрация: 31.10.2006 Где: CyberLand Репутация: 11 Всего: 28 |
Из соображений оптимизации скорее всего, но каких... Надо спросить на форуме майкрософт)
-------------------- Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно) Telegram, skype: kuchuk.artiom |
|||
|
||||
| NightmareZ |
|
|||
![]() [хакер] ![]() ![]() Профиль Группа: Участник Сообщений: 699 Регистрация: 10.8.2006 Репутация: 2 Всего: 13 |
Никаких там оптимизаций нет и быть не может. -------------------- NightmareZ.net - мой блог и сайт, мои проекты и прочий трэш Ely-Art.ru - наша маленькая домашняя арт-студия mugcraft.ru - кружки на любой вкус |
|||
|
||||
| gambit |
|
|||
![]() Эксперт ![]() ![]() ![]() Награды: 1 Профиль Группа: Комодератор Сообщений: 1359 Регистрация: 25.6.2006 Где: я? Репутация: 5 Всего: 40 |
||||
|
||||
| NightmareZ |
|
|||
![]() [хакер] ![]() ![]() Профиль Группа: Участник Сообщений: 699 Регистрация: 10.8.2006 Репутация: 2 Всего: 13 |
....да плодятся, и мухи и баги, и я каждый день в этом убеждаюсь Потому что негде. Это же очевидно. Это реальный код. Хочешь я тебе напишу класс CoolString, для которого и первый и второй вариант будет работать + он будет полностью совместим со стандартным string'ом. -------------------- NightmareZ.net - мой блог и сайт, мои проекты и прочий трэш Ely-Art.ru - наша маленькая домашняя арт-студия mugcraft.ru - кружки на любой вкус |
|||
|
||||
| gambit |
|
|||
![]() Эксперт ![]() ![]() ![]() Награды: 1 Профиль Группа: Комодератор Сообщений: 1359 Регистрация: 25.6.2006 Где: я? Репутация: 5 Всего: 40 |
||||
|
||||
| NightmareZ |
|
||||
![]() [хакер] ![]() ![]() Профиль Группа: Участник Сообщений: 699 Регистрация: 10.8.2006 Репутация: 2 Всего: 13 |
Потому что сейчас можно неявно привести int к string, но нельзя неявно привести string к int. Если бы были возможны оба преобразования, то как разрулить такой код
Добавлено через 3 минуты и 24 секунды А чёрт его знает.... может он вообще нативный -------------------- NightmareZ.net - мой блог и сайт, мои проекты и прочий трэш Ely-Art.ru - наша маленькая домашняя арт-студия mugcraft.ru - кружки на любой вкус |
||||
|
|||||
| gambit |
|
||||
![]() Эксперт ![]() ![]() ![]() Награды: 1 Профиль Группа: Комодератор Сообщений: 1359 Регистрация: 25.6.2006 Где: я? Репутация: 5 Всего: 40 |
а причем здесь это? неявное приведение всегда только в одну сторону. мы можем родителя привести к потомку, но не потомка к родителю. мы можем int привести к int64, но не наоборот. так вы и не колитесь, где же вы его нашли, если он реальный. кроме того если тот код реален, то как вы объясните это???
что в классе string знак + перегружен для всех возможных вариантов??? |
||||
|
|||||
| NightmareZ |
|
||||||||
![]() [хакер] ![]() ![]() Профиль Группа: Участник Сообщений: 699 Регистрация: 10.8.2006 Репутация: 2 Всего: 13 |
Парень, да ты упоротый и ничего в теме не понимаешь, потому глупые вопросы.... дык, ты ещё и спорить пытаешься. Неявное приведение работает так, как мы того хотим (или как того хотят люди, которые создали типы данных, которыми мы пользуемся).
Вот класс. Можно его привести к int, и можно int привести к нему.... неявно.
Смотрим:
Работает! Как где? Написал! Не веришь, что он реальный - скомпилируй и запусти.
В данном конкретном примере есть только неявное преобразование из string в int. Это сообщение отредактировал(а) PashaPash - 27.2.2010, 02:53 -------------------- NightmareZ.net - мой блог и сайт, мои проекты и прочий трэш Ely-Art.ru - наша маленькая домашняя арт-студия mugcraft.ru - кружки на любой вкус |
||||||||
|
|||||||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 11 Всего: 92 |
Да ничего там не перегружено. Это фича на уровне компилятора. Вызывается String.Concat (который принимает обжекты).
Почему нельзя присваивать инты стрингам? ИМХО, решили, что это может привести к лишним случайным ошибкам (ну т. е. тот случай когда лишняя "неявность" - это плохо). Объективно тут не ответишь (плохо или нет), но я согласен Ну и для параноиков - надо вызывать ToString, который возовет Int32.ToString, а не пользоваться конкатом, примающим обжекты и, как следствие, вызывающий боксинг числа (о, ужас - это ж дикие затраты!). Запомните это хорошо! |
|||
|
||||
| NightmareZ |
|
|||
![]() [хакер] ![]() ![]() Профиль Группа: Участник Сообщений: 699 Регистрация: 10.8.2006 Репутация: 2 Всего: 13 |
А это уже непринципиально, разруливает ли это компилятор или рантайм. В термах же языка это именно перегрузка оператора. Посмотри выше про неоднозначность Console.WriteLine(s + i); Добавлено через 1 минуту и 17 секунд Если ты о моём примере, то там int сначала преобразуется в string, а уже потом вызывается перегруженная версия Concat, которая принимает два параметра string. -------------------- NightmareZ.net - мой блог и сайт, мои проекты и прочий трэш Ely-Art.ru - наша маленькая домашняя арт-студия mugcraft.ru - кружки на любой вкус |
|||
|
||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 11 Всего: 92 |
Эээ.. неявно получать из строки число - это очевидно плохо. Обратное - спорно. Хотя я за то, чтобы нельзя было неявно ни туда, ни сюда Добавлено через 1 минуту и 35 секунд
В каком? С райт-лайном? Предполагаю, что там боксится i, а затем вызывается Concat. Добавлено через 3 минуты и 56 секунд И.. если придираться. Пример с якобы перегруженным оператором + (ок, детали реализации неважны, смотрим результат) неверен. Как раз прямое использование + (без вызова ToString ведёт к боксингу и Concat-у с обжектами. А вызов ToString - к Int32.ToString + конкат со стрингами. |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |