Последние комментарии

Для меня эта страница - это удобный способ смотреть, что нового происходит в комментариях и сразу находить заметку, не заходя в админку. Думаю, она будет полезна и тебе.


Pavel

Михаил, в хроме с ошибками дизайн отображается, расползается )


Фифа

Юрась, я тоже так думал очень долгое время, пока не обзавелся несколькими компами с разными осями и не стал эксперементировать на своём ресурсе.
И вот что я скажу, обмануть статистику не то что бы невозможно но довольно сложно и требует не совсем "стандартных" средст. Так что думается мне теперь что максимальная погрешность в статистике от таких вот "обманывающих" не более 1-2% что довольно таки несущественно.


Юрась

Не верь стасиське, она врёт))) браузеры обманывают гуглю;) информация о браузере и системе бывают и ложные))


Михаил Фленов

Прекрасно понимаю, почему это произошло. Просто локальная переменная объявленная внутри метода,имеет приоритет над переменными класса. Если у тебя есть что-то типа:


class MMM{
  int i = 10;

  voi Method() {
    int i = 20;
    // - здесь i будет использоваться локальная
  }
}


Это нормальная ситупция и это давно так принято. В данном случае у компилятора нет ошибки и он прав. Я просто описал то, что увидел, просто потому, что впервые увидел такое. Это не косяк, это не ошибка MS, это просто такое поведение. Компилятор действительно, когда анализирует код, видит строку:

int id = InsertToDB();

Он видит, что это первое объявление переменной id внутри данного метода, а это легально для него, потому что локальные имеют приоритет. На втором проходе происходит косяк, потому что на этом этапе он уже видит, что две переменные конфликтуют.

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

Еще раз говорю, в данном случае никакого упрека в сторону компилятора и в сторону дороговизны XBox Live Gold. Я просто описал то, с чем столкнулся.


Sat

Все дело в том, что современные компиляторы взяли за правило компилировать код не останавливаясь на возможных ошибках. То есть, сперва компилируем всё и выводим все найденные ошибки. Это возможно сделать только если за первый проход компилятора ошибки определялись синтаксическим анализатором компилятора и записывались в массив или список. Давайте просмотрим что при таком подходе происходит.
Итак строка:
methodName(int id)
допустим, что (утрировано) переменные и их типы мы храним в списке List[Name]=Type и в этой строке список преобретает такое значение List[id]=int, ну то есть в список мы записываем имя переменной и её тип.

Далее анализатор натыкается на данную строку
int id = InsertToDB();
Естественно если он не может определить тип какой то переменной, то, что бы продолжить компилирование он должен присвоить тип и значение по умолчанию данной переменной. В итоге имеем следующее:
List[InsertToDB]=Unknown
или другой тип отличный от int и, что бы не допустить ошибки при дальнейшей компиляции необходима замена
List[id]=int на List[id]=Unknown так как язык является строго типизированым и типы должны совпадать. Уж почему в этом случае тип по умолчанию берётся неопределённый остаётся спросить разработчиков?

И напоследок, при втором проходе сравниваются типы переменных и получается, что в строке
int i = id + 1;
id имеет тип Unknown о чем и сообщает компилятор.

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


Михаил Фленов

Не логично, потому что у тебя есть параметр с таким именем и компилятор должен видеть эту переменную в параметре. Логичной является ошибка  A local variable named 'id' cannot be declared in this scope because it would give a different meaning to 'id', потому что именно она вызывает проблему.


Не поленился, набрал код. Все логично, компилятор выделяет 1-ю строку кода и пишет, что невозможно использовать локальную переменную до её объявления. Что не логичного??? Если ты объявляешь её ниже.


Олег

Интересно было б почитать сравнение дроида с ios)


Sergey

тогда не знаю в чем причина


Михаил Фленов

На этом блоге никаких ограничений на время нет. С мобильника набирал и никогда не было проблем. Ограничение есть на блоге Курилка, но там это проблема стороннего компонента, который я использую и я планирую заменить каптчу.


О блоге

Программист, автор нескольких книг серии глазами хакера и просто блогер. Интересуюсь безопасностью, хотя хакером себя не считаю

Обратная связь

Без проблем вступаю в неразборчивые разговоры по e-mail. Стараюсь отвечать на письма всех читателей вне зависимости от страны проживания, вероисповедания, на русском или английском языке.

Пишите мне