Use of unassigned local variable c что значит
Перейти к содержимому

Use of unassigned local variable c что значит

Use of unassigned local variable c что значит

else if (radioButton15.Checked)

varResults = Question1 + Question2 + Question3 + Question4 + Question5;

if (varResults == 5)

MessageBox .Show( "You are most like Zombie #12: On TV as in life, you’re a bit player and you get lost in a crowd of one." );

else if (varResults == 6)

MessageBox .Show( "You are most like Rick: Emo much? Seriously, you need to lighten up! People follow your lead but they’re groaning inside. And you’re a little bit cuckoo. I suggest Lithium." );

else if (varResults == 7)

MessageBox .Show( "You are most like Lori: Your theme song is \"Torn Between Two Lovers.\" You want it all except when it comes to food. You need to eat a sammich, girl! And roll down your damned pants! No one likes you and we’re all glad you died." );

else if (varResults == 8)

MessageBox .Show( "You are most like Andrea: You’re a rebel with low self-esteem. Maybe you’re a rebel BECAUSE you have low self-esteem. Frankly, no one cares why. No one listens to you unless you fart." );

else if (varResults == 9)

MessageBox .Show( "You are most like Carl: Most people find you annoying and try to avoid your company. You’re handy at reaching things on the bottom shelf because you’re short, but that’s pretty much the extent of your usefulness. People call you an ankle-biter behind your back." );

else if (varResults == 10)

MessageBox .Show( "You are most like Daryl: You’re kind of smelly and sweaty and people are usually repulsed by you at first meeting, but you are actually like whatever they call those ugly rocks that have pretty crystals inside." );

else if (varResults == 11)

MessageBox .Show( "You are most like Carol: You’re too often overlooked unless it concerns girl-stuff, but you’re willing and able to step up to the plate….and wash it." );

else if (varResults == 12)

MessageBox .Show( "You are most like Maggie: In any crowd, you’re usually considered the prettiest (even if only due to lack of competition), but you’re not just another pretty face. You’re good at kicking butt too. You suck." );

else if (varResults == 13)

MessageBox .Show( "You are most like Beth: When your name is mentioned, it most often prompts the question \"Who?\" You may be blonde but you’re not having more fun. There’s really not much more to say about you." );

else if (varResults == 14)

MessageBox .Show( "You are most like Michonne: You one bad-ass girl. You don’t take any crap, preferring to lop off heads when anyone opposes you. Brava!" );

else if (varResults == 15)

MessageBox .Show( "You are most like The Governor: I don’t even know what to say about YOU! Naughty!" );

What does "Use of unassigned local variable" mean?

I keep getting this error for annualRate, monthlyCharge, and lateFee.

11 Answers 11

The compiler isn’t smart enough to know that at least one of your if blocks will be executed. Therefore, it doesn’t see that variables like annualRate will be assigned no matter what. Here’s how you can make the compiler understand:

The compiler knows that with an if/else block, one of the blocks is guaranteed to be executed, and therefore if you’re assigning the variable in all of the blocks, it won’t give the compiler error.

By the way, you can also use a switch statement instead of if s to maybe make your code cleaner.

user avatar

Change your declarations to this:

The error is caused because there is at least one path through your code where these variables end up not getting set to anything.

Because if none of the if statements evaluate to true then the local variable will be unassigned. Throw an else statement in there and assign some values to those variables in case the if statements don’t evaluate to true. Post back here if that doesn’t make the error go away.

Your other option is to initialize the variables to some default value when you declare them at the beginning of your code.

Give them a default value:

Basically, all possible paths don’t initialize these variables.

Use the keyword "default".

There are many paths through your code whereby your variables are not initialized, which is why the compiler complains.

Specifically, you are not validating the user input for creditPlan — if the user enters a value of anything else than «0»,»1″,»2″ or «3» , then none of the branches indicated will be executed (and creditPlan will not be defaulted to zero as per your user prompt).

As others have mentioned, the compiler error can be avoided by either a default initialization of all derived variables before the branches are checked, OR ensuring that at least one of the branches is executed (viz, mutual exclusivity of the branches, with a fall through else statement).

Ошибка C # CS0165: использование неназначенной локальной переменной — игнорирование логики и исходящей ссылки

Насколько я понимаю, код никогда не дойдет до строки сравнения, если dteDest не инициализирован DateTime.TryParse, для которого он является параметром out.

  1. Если currentDataObj имеет значение null, то booHaveOrigDate имеет значение false и первое if не удается
  2. Если currentDataObj не равно нулю, но не может быть преобразован в DateTime, тогда booHaveOrigDate имеет значение false и первое if не удается
  3. DateTime.TryParse вернет false, если он не может преобразовать в DateTime, это вместе с && означает, что dteDest никогда не будет использоваться.

Простой пример кода

Также, если я изменю строку

тогда компилятор жалуется, что srcDate также не назначен.

Может ли кто-нибудь указать мне правильное направление того, чего мне не хватает — я не имею в виду проверку параметров и т. Д. Меня беспокоит, почему логика компилятора, похоже, обманывается использованием общей функции TryParse?

Дополнительная информация

Даже расширение логики по-прежнему дает ту же ошибку (использование неназначенной локальной переменной)

Похоже, что это то, что компилятор делает с нулевой проверкой (currentDataObj! = Null), что мешает ему правильно определить, что dteDest не будет доступен, если не назначен

Измените его на этот код и никаких проблем (кроме возможного .ToString () для нулевого объекта

5 ответы

Ваша замена неверна, она должна быть:

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

Теперь вам не нужно назначать даты в начале.

** Вы должны протестировать этот код перед использованием, это не производственный код и может содержать ошибки.

ответ дан 26 окт ’11, 10:10

Спасибо за отзыв, я проиллюстрировал то, что компилятор жалуется на переменную dteSrc только тогда, когда я изменяю строку, чтобы включить «(srcData! = Null) &&» в строку «bool booHaveNewDate = DateTime.TryParse (srcData.ToString (), из dteSrc); «. В остальном он не жалуется на dteSrc. Извините, объяснение не было ясным в конце исходного вопроса. — Доступ к ИТ

Компилятор не может следовать вашей логике. Просто недостаточно умен, чтобы следовать всем путям кода. Вы можете обмануть его, поручив им сначала переписать ваш код, чтобы он понимал ваш код. Строка (srcData! = Null) не позволяет компилятору видеть, что происходит. — Питер

Конечно, этот код просто не сработает, если currentDataObj имеет значение null — эта проверка и является всей причиной проблемы. Пропуск проверки на самом деле ничего не решает. — Крис

Первоначально у меня был такой код, но мне нужно было использовать результат теста TryParse в коде, который не был показан в примере. Ошибка проявилась только тогда, когда я изменил его на опубликованный мной код. Похоже, что добавление «(currentDataObj! = Null) &&» перед TryParse мешает синтаксическому анализу компилятора — Доступ к ИТ

Насколько я понимаю, сначала потребуется нулевой тест, чтобы гарантировать, что метод .ToString () не завершится ошибкой при вызове TryParse — Доступ к ИТ

Компилятор формально правильный, присвоение dteDest (в виде out параметр) является условным. В глазах компилятора этого могло и не произойти. Компилятор не «понимает» логику, которая следует из TryParse ().

Вот похожая ситуация:

Кстати, кажется более логичным инициализировать с помощью

это то же самое значение (DateTime.MinValue), хотя.

ответ дан 26 окт ’11, 10:10

Но не будет ли возвращаемое значение TryParse обрабатывать случай, когда преобразование не выполняется (а не просто использовать DateTime.Parse) — Доступ к ИТ

Да, если компилятор не оценивает код, он не «понимает», что «if (x <= 5) r = 1; if (x> 5) r = 2;» совпадает с «if (x <= 5) r = 1; иначе r = 2; » или «r = x <= 5? 1: 2;» — Доступ к ИТ

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

Ну, я немного осмотрелся, и хотя я нашел пару примеров людей, говорящих по существу то же самое, что и я, я не могу найти никакой официальной документации, подтверждающей это. Вот ответы, которые я нашел:

«Компилятор имеет полное право не знать вашей логики».

«. когда есть структура потока управления, она не может оценить ситуацию, потому что не выполняет код, поэтому не знает, присваиваются ли значения».

ответ дан 26 окт ’11, 10:10

Спасибо, есть несколько отличных моментов. Однако кажется, что это связано с тем фактом, что dteDest можно не назначать, потому что он используется только тогда, когда оператор DateTime.TryParse (currentDataObj.ToString (), out dteDest), выходной параметр которого является . Его вводят в заблуждение, добавляя нулевой тест как часть логики — Доступ к ИТ

dteDest не будет иметь значение, если currentDataObj == null

Это будет работать, если вы измените свою строку на:

ответ дан 26 окт ’11, 10:10

Но ты не можешь позвонить ToString() on null . — Хенк Холтерман

Логический результат нулевого теста и DateTime.TryParse используется в «if (booHaveNewDate && booHaveOrigDate) <", который должен маскировать, является ли dteSrc или dteDest неназначенным - Доступ к ИТ

Если currentDataObj не назначен, он будет использовать строку.Empty для TryParse, которая вернет false и установит для dteDest значение MinValue. — Воутер де Корт

логика компилятора, похоже, обманута из-за использования общей функции TryParse

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

Но это не совсем твоя проблема. Проблема заключается в следующей строке:

Использует && оператор, который не будет оценивать вторую часть, если первая часть ложна. Это называется оценкой короткого замыкания и основывается на теории, согласно которой, если первая часть ложна, то не имеет значения, что такое вторая часть — общий результат всегда будет ложным.

Таким образом, в этом случае dteDest никогда не устанавливается, и компилятор считает, что это проблема, даже если вы посмотрите на логику и скажете, что код никогда не запустится, если он не установлен.

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

ответ дан 26 окт ’11, 10:10

Я прекрасно понимаю, что вы имеете в виду, и это очень логично. Я обновил исходный контент quesiton с помощью раздела «Дополнительная информация», который показывает расширенное if / else, которое, тем не менее, обманывает компилятор. — Доступ к ИТ

Может, я слишком много болтала. Существенным моментом является то, что существует кодовый путь, в котором не установлен dteDest. Ни о чем другом не имеет значения, просто компилятор при просмотре всех путей в коде видит тот, который может заставить его перейти к использованию объекта до того, как он будет назначен. Он вообще не смотрит, какая логика ведет его по каким путям. Я понимаю, насколько вы думаете, что это глупо, я был бы склонен согласиться в таком простом случае, как этот. Однако так работает компилятор. Если вы хотите вникнуть в детали конструкции компилятора, я бы предложил задать отдельный конкретный вопрос. — Крис

Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками c# tryparse unassigned-variable or задайте свой вопрос.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *