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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Защита С# от логических ошибок, Интересная задачка 
:(
    Опции темы
ivashkanet
Дата 22.3.2006, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



В теме Преобразование типов, товарища bankuss-а, была затронута тема преобразования типов (int в string).
По этому поводу велись большие дискуссии:
Например, такой код почему-то неработает в C#, а в VB -- работает.
Цитата

lk = (string) km;

Здесь lk -- string, km -- int.

Были даны комментарии (arilou):
Цитата

Данная строка означает "приведем переменную типа int к типу string". Для того, чтобы такая операция сработала, int должен стоять в цепочке наследования после string, либо string должен быть интерфейсом, который реализуется в классе int. Ни первое, ни второе не верно, поэтому операция приведения типа не работает.


После чего последовало много коментариев:

Цитата

arilou, иногда такие "мелочи" мешают работать!  а для чего язык высокого уровня сделан? чтоб облегчить программистский труд  а тут приходится тонну литературы прочитать прежде чем станет ясна проблема.... проще надо быть...


Цитата

Цитата

Цитата(bankuss @ 15.3.2006, 16:42 )
а для чего язык высокого уровня сделан


Честно - то, о чем ты говоришь реализовано в VB.NET. Но поверь мне, недостатков больше чем достоинств.


Это, как говориться, присказка, а сказка будет впереди.

Кто сможет, с ходу, без компиляции кода, решить задачку:
Дан простой код
Код

int a = 10, b = 13;
string str = a + b;

Вопрос: какое значение примет str, и примет ли вообще?
Ответ пояснить (т.е. почему именно так, а не иначе).

P.S. Вечером дам правильный ответ и коментарии.
P.P.S. Просьба подумать самим, код не компелировать, только если для проверки
своей точки зрения.
P.P.P.S. mr.DUDA, arilou и другие модераторы,
не отвечайте, пожалуйста, на вопрос сразу. Потерпите, пожалуйста,
жотя бы до обеда. Не сбивайте интригу.

Это сообщение отредактировал(а) ivashkanet - 22.3.2006, 08:54
PM MAIL WWW ICQ   Вверх
FatherFrost
Дата 22.3.2006, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Почетный Мороз
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 27.4.2005
Где: Крайний север

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



Этот код вообще не скомпилится. Если ты напишешь:
Код

int a = 10;
string str = a;

то компилятор тебе не даст это сделать. В своем задании ты предлагаешь сделать примерно тоже самое. Насколько я понял, объяснение этому уже дал arilou. Строка 2 в твоем задании по сути повторяет строку bankuss-а... Вот и все...


--------------------
Задаю много глупых вопросов....
PM MAIL ICQ   Вверх
Exception
Дата 22.3.2006, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 29
Всего: 186



Имхо, данный код не скомпилится, поскольку ты присваиваешь int string'у без преобразования (хотя и оно все равно не получилось бы).
PM   Вверх
ivashkanet
Дата 22.3.2006, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(FatherFrost @ 22.3.2006, 10:24 Найти цитируемый пост)
Этот код вообще не скомпилится. Если ты напишешь:

Код

код C#    
1:    
2:    
int a = 10;    
string str = a;    


то компилятор тебе не даст это сделать. В своем задании ты предлагаешь сделать примерно тоже самое. Насколько я понял, объяснение этому уже дал arilou. Строка 2 в твоем задании по сути повторяет строку bankuss-а... Вот и все...


Цитата(Exception @ 22.3.2006, 12:54 Найти цитируемый пост)
Имхо, данный код не скомпилится, поскольку ты присваиваешь int string'у без преобразования (хотя и оно все равно не получилось бы)


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

Явное:
Код

public static implicit operator string(int intValue)
        {
            return intValue.ToString();
        }

Или неявное:
Код

public static explicit operator string(int intValue)
        {
            return intValue.ToString();
        }



Так печему же не сделали это разработчики???
Вот в чем вопрос???
Почему они отказались от явного или неявного преобразования????


P.S. Можно глянуть в название темы.
PM MAIL WWW ICQ   Вверх
Domestic Cat
Дата 22.3.2006, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 9
Всего: 172



Потому что непонятно, что ты хочешь сделать строкой
Код

string str = a + b;

- то ли сложить два числа и далее инициализировать стринг ("23"), то ли получить "1013". Отсутствие неявной конвертации в стринг по-моему более безопасно. Никто не мешает написать например
Код

string str = string.Format("{0}{1}", a, b);

или
Код

string str = (a + b).ToString();

В общем, не понимаю в чем проблема.


--------------------

PM   Вверх
mr.DUDA
Дата 22.3.2006, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Интересно, почему тогда вот так можно:
Код
using System;

class TestApp
{
    static void Main()
    {
        string s = "";
        int a = 10, b = 13;
        s += a + b; // "23"
    }
}

smile


--------------------
user posted image
PM MAIL WWW   Вверх
ivashkanet
Дата 22.3.2006, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(Domestic Cat @ 22.3.2006, 15:39 Найти цитируемый пост)
Потому что непонятно, что ты хочешь сделать строкой
Код

string str = a + b;

- то ли сложить два числа и далее инициализировать стринг ("23"), то ли получить "1013". Отсутствие неявной конвертации в стринг по-моему более безопасно. Никто не мешает написать например

Именно

Вот это я и хотел сказать.
Что С# -- язык, в котором уже на этапе компиляции должны отпадасть все неопределенности и двусмысленности!!! smile

И хочу поделиться, увиденным мною, принципом языка C#:

Если запись может трактоваться двусмысленно -- то она не должна присутствовать в языке!!! Программист должен явно указать, что он хочет сделать.


Например, если добавить пустую строку в начало:
Код

int a = 2, b = 134;
string s;
s = "" + a + b;

то все будет хорошо (str+int = str) и результат будет "2134"
А если в конец:
Код

int a = 2, b = 134;
string s;
s = "" + a + b;

то int +int = int, int + str =str и результат будет "136"

То есть двусмысленность отпала (раз мы используем "", то явно результат строка)

P.S. В общем мне понравилась строгость языка C# и я захотел поделиться этим с другими.
А то бывает неделю ищешь ошибку, а она рассмотренного типа smile.

P.P.S. Всем спасибо. Я люблю C#. Прям балдею.
PM MAIL WWW ICQ   Вверх
ivashkanet
Дата 22.3.2006, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(mr.DUDA @ 22.3.2006, 15:56 Найти цитируемый пост)
Интересно, почему тогда вот так можно:
Код

using System;    
class TestApp    
{    
    static void Main()    
    {    
        string s = "";    
        int a = 10, b = 13;    
        s += a + b; // "23"    
    }    
}


Тут скорее всего такая ситуация:
Код

s+=a; 

эквивалентно записи
Код

s=s+a; 

str + int = str -- все пуском smile
А код
Код

 s += a + b;

скорее всего соответствует коду
Код

 s= s + (a + b);

Скобки стоят потому, что в операторе += сначала считается правая часть, а потом она добавляется к переменной слева.
И вообще += нет в операторах C#, он скорее всего обрабатыветься при синтаксическом разборе кода.
P.S. mr.DUDA, пока писал прозевал твое сообщение.
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 22.3.2006, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



ivashkanet, так это всё ясно. Непонятно, почему при конкатенации строки с int-ом идёт неявное преобразование int->string, а при присваивании - нет smile
Добавлено @ 17:00
З.Ы, ещё я хотел бы попросить не злоупотреблять ОГРОМНЫМ шрифтом - в глазах рябит smile


--------------------
user posted image
PM MAIL WWW   Вверх
ivashkanet
Дата 22.3.2006, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Ну так написано ж

Цитата(Domestic Cat @ 22.3.2006, 15:39 Найти цитируемый пост)
Потому что непонятно, что ты хочешь сделать строкой
Код

string str = a + b;

- то ли сложить два числа и далее инициализировать стринг ("23"), то ли получить "1013".


А int + str -- все ясно: str к int не приведешь, поэтому однозначно нужно приводить int к str.
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 22.3.2006, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(ivashkanet @ 22.3.2006, 16:22 Найти цитируемый пост)
А int + str -- все ясно: str к int не приведешь, поэтому однозначно нужно приводить int к str.

вот это "нужно" почему-то не совсем ясно почему именно оно нужно smile


--------------------
user posted image
PM MAIL WWW   Вверх
ivashkanet
Дата 22.3.2006, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(mr.DUDA @ 22.3.2006, 17:32 Найти цитируемый пост)
вот это "нужно" почему-то не совсем ясно почему именно оно нужно

Не понял, поясни.

P.S. Каждый оператор что-то должен делать. У этого только два варианта (см. выше), из которых первый бессмысленный. smile
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 22.3.2006, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(ivashkanet @ 22.3.2006, 16:45)
Цитата(mr.DUDA @  22.3.2006,  17:32 Найти цитируемый пост)
вот это "нужно" почему-то не совсем ясно почему именно оно нужно

Не понял, поясни.

P.S. Каждый оператор что-то должен делать. У этого только два варианта (см. выше), из которых первый бессмысленный. smile

В языке, в котором синтаксисом запрещено приведение int к string, не должно быть неявного приведения в частном случае. Если и так не понятно, то вот тебе код:
Код
using System;

class TestApp
{
    static void Main()
    {
        string s = "";
        s = s + 10; // компилируется !
        s = s + (string)10; // не компилируется ! error CS0030
    }
}

Я считаю, что такое несоответствие - это недоработка компилятора.


--------------------
user posted image
PM MAIL WWW   Вверх
ivashkanet
Дата 22.3.2006, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(mr.DUDA @ 22.3.2006, 18:32 Найти цитируемый пост)
Я считаю, что такое несоответствие - это недоработка компилятора.

Может ты и прав, у каждого свое мнение.
Но на мой взгляд неопределенности и двуссмысленности нет.
Поэтому можно его сделать неявным.

Цитата(mr.DUDA @ 22.3.2006, 18:32 Найти цитируемый пост)
В языке, в котором синтаксисом запрещено приведение int к string, не должно быть неявного приведения в частном случае.

Хотя..., только сейчас подумал, почему не сделать явное преобразование int в strins вся ответственность в этом случае ложится на программиста smile .

P.S. mr.DUDA, не оскверняй светлый лик C# (шутка) smile .
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 22.3.2006, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(ivashkanet @ 22.3.2006, 18:07 Найти цитируемый пост)
Но на мой взгляд неопределенности и двуссмысленности нет.
Поэтому можно его сделать неявным.


Цитата(ivashkanet @ 22.3.2006, 18:07 Найти цитируемый пост)
P.S. mr.DUDA, не оскверняй светлый лик C# (шутка) 


C# - это ведь не PHP, где всё можно smile


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

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


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

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


 




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


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

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