Эффект приведения к int в C # - PullRequest
0 голосов
/ 26 февраля 2009

Может ли кто-нибудь найти время, чтобы объяснить мне языковые основы здесь:

int foo = myObject.SomeList.Count;
for (int i = 0 ; i < foo ; i++)
{
  myObject.SomeList.Add(bar);
}

входит в бесконечный цикл, потому что foo ссылается на значение, которое продолжает увеличиваться. Изменение первой строки:

int foo = (int)myObject.SomeList.Count;

заставляет его исчезнуть, как-то раз и навсегда изменив foo со ссылки на значение. Вероятно, это учебник, но почему это происходит?

Большое спасибо

РЕДАКТИРОВАТЬ: Хорошо, как упоминает Патрик, бесконечный цикл происходит только тогда, когда нет предварительного хранилища для foo, бросание бессмысленно, что имеет смысл. Это действительно то, что я думал изначально, отлаживая это. Отсюда и мое удивление, когда актеры это исправили. На самом деле Visual Studio ввел меня в заблуждение, заставив думать, что я исправил его, когда возникла проблема синхронизации между отредактированным кодом и исполняемым кодом, что привело к неверным выводам.

Ответы [ 3 ]

8 голосов
/ 26 февраля 2009

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

// SomeList is not empty before the loop
for (int i = 0; i < myObject.SomeList.Count; i++)
{
    myObject.SomeList.Add(bar);
}

В этом случае мы не храним Count в int, поэтому каждый раз, когда мы добавляем в список, мы сравниваем i + 1 с Count + 1, следовательно, бесконечный цикл.

6 голосов
/ 26 февраля 2009

Ты уверен? !!

int является типом значения. Этого не должно быть.

Джон Скит, приходи и помоги!

4 голосов
/ 26 февраля 2009

Поведение, которое вы описываете, не может происходить в C #. Вы явно объявили значение foo как int в обоих случаях. Это тип значения. По определению экземпляр, на который указывает foo, отделен от исходного экземпляра в myObject.SomeList.Count.

Можете ли вы опубликовать более подробный пример кода?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...