2013-11-12 4 views
0

У меня есть переменная, установленная в C#, которая изменяется в зависимости от того, какой оператор If выбран.Если утверждения в методах

Но когда я пытаюсь Console.WriteLine переменная, она говорит мне, что переменная не существует в текущем контексте, может ли кто-нибудь помочь мне с этим, пожалуйста?

public void mood() 
{ 
    var unhappiness = Hunger + Boredom; 

    if (unhappiness < 5) 
    { 
    string m = "Happy"; 
    } 

    if (unhappiness <= 5 && unhappiness <= 10) 
    { 
    string m = "Okay"; 
    } 

    if (unhappiness <= 11 && unhappiness <= 15) 
    { 
    string m = "Frustrated"; 
    } 

    if (unhappiness <= 16) 
    { 
    string m = "Mad"; 
    } 

    Console.WriteLine(m); 
} 

Переменная «m» является той, с которой я столкнулся.

+0

m не входит в сферу применения. –

+0

Переместите строку m в начало метода и удалите строку слов из isnide ifs. –

+0

У вас есть и другие проблемы. Предполагая, что область видимости m фиксирована, это вернет Mad для всех значений <= 16 и Happy для всех значений> 16. –

ответ

2

вам нужно объявить строку м вне - после того, как ваш метод decleration:

public string mood() 
     { 
      var unhappiness = Hunger + Boredom; 
      string m = string.Empty; 
      if (unhappiness < 5) 
      { 
       m = "Happy"; 
      } 

      if (unhappiness <= 5 && 
       unhappiness <= 10) 
      { 
       m = "Okay"; 
      } 

      if (unhappiness <= 11 && 
       unhappiness <= 15) 
      { 
       m = "Frustrated"; 
      } 

      if (unhappiness <= 16) 
      { 
       m = "Mad"; 
      } 
      return m; 
+0

Просто деталь, но возврат строки из метода void не будет работать;) – oerkelens

+0

хороший улов ... позвольте мне изменить! –

3

Это:

{ 

} 

помещает переменную внутри этой сферы, поэтому он не будет доступен за пределами Это. Вот почему вы можете объявить 4 переменные с именем m, как вы это делали. Каждый m - это другой парень, внутри своего маленького мира скобок.

Я думаю, что вы можете объявить заранее:

string m=""; 

if (unhappiness < 5) 
{ 
    m = "Happy"; 
} 

if (unhappiness <= 5 && 
    unhappiness <= 10) 
{ 
    m = "Okay"; 
} 

if (unhappiness <= 11 && 
    unhappiness <= 15) 
{ 
    m = "Frustrated"; 
} 

if (unhappiness <= 16) 
{ 
    m = "Mad"; 
} 
+0

Пытается grok C# scope. Похоже, что здесь происходит то, что если переменная объявлена ​​в верхней части блока, а затем назначение происходит внутри вложенного блока, назначение сохраняется за пределами внутреннего блока. С другой стороны, чтобы скрыть переменную во внутреннем блоке, мне пришлось бы RE-DECLARE в этом блоке. Верный? В противном случае переменная все равно будет ссылаться на родительский экземпляр. – seebiscuit

0

Как написано, переменная m существует только в пределах каждого if заявления.

Вы должны объявить m в глобальном масштабе метода:

public void mood() 
{ 
     string m = "default mood"; 
     // ... 
} 

Это позволит сделать его доступным для всех дочерних областей (с разделителями в фигурные скобки), в том числе каждый из if заявлений.

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

0
 public void mood() 
    { 
     var unhappiness = Hunger + Boredom; 
     string m; 
     if (unhappiness < 5) 
     { 
      m = "Happy"; 
     } 

     if (unhappiness <= 5 && 
      unhappiness <= 10) 
     { 
      m = "Okay"; 
     } 

     if (unhappiness <= 11 && 
      unhappiness <= 15) 
     { 
      m = "Frustrated"; 
     } 

     if (unhappiness <= 16) 
     { 
      m = "Mad"; 
     } 

     Console.WriteLine(m); 
1

Определить строку M перед операторами if. Если вы инициализируете его сразу после несчастья var и устанавливаете его в if-statements. Вы определяете строку m внутри if-операторов, но когда они заканчиваются, строка m также исчезает.

1

Попробуйте вместо этого:

public void mood() 
{ 
    var unhappiness = Hunger + Boredom; 

    string m = string.Empty; 

    if (unhappiness < 5) 
    { 
     m = "Happy"; 
    } 

    if (unhappiness >= 6 && unhappiness <= 10) 
    { 
     m = "Okay"; 
    } 

    if (unhappiness >= 11 && unhappiness <= 15) 
    { 
     m = "Frustrated"; 
    } 

    if (unhappiness >= 16) 
    { 
     m = "Mad"; 
    } 

    Console.WriteLine(m); 
} 

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

0

строка m определена внутри ваши if-предложения. Кроме того, вы не можете вернуть строку из вашего метода, поэтому я изменил это :)

попробовать

public string mood() 
{ 
    var unhappiness = Hunger + Boredom; 
    string m = string.Empty; 

    if (unhappiness < 5) 
    { 
     m = "Happy"; 
    } 

     // etc 

    return m; 
} 
0

m не существует. Вот почему вы не можете распечатать его или сделать с ним что-либо.Этого не существует. Нет такой переменной, как m.

В некоторых внутренних областях было несколько переменных, которые назывались m. Но они исчезли, пока вышел блок, в котором они были определены. Теперь они принадлежат к прошлому, которое не может вернуться. Их воспоминания отплыли, как капли в океане сбора мусора.

0

Чтобы исправить ваши проблемы вы можете сделать что-то вроде этого:

public void mood() 
{ 
    var unhappiness = Hunger + Boredom; 
    string m = "Unknown"; 

    if (unhappiness < 5) 
    { 
    m = "Happy"; 
    }  
    else if (unhappiness >= 5 && unhappiness <= 10) // >= 5 not <= 5 
    { 
    m = "Okay"; 
    } 
    else if (unhappiness > 11 && unhappiness <= 15) // > 10 or >= 11 not <= 11 
    { 
    m = "Frustrated"; 
    } 
    else if (unhappiness >= 16) // assume it should be enything else 
    { 
    m = "Mad"; 
    } 

    Console.WriteLine(m); 
} 
  • Определение переменной и использование переменной должно происходить в том же объеме, который определяется с помощью фигурных скобок { }.
    Таким образом, вы можете использовать m во всем настроении метода, но не вне метода настроения в этом случае.
  • if, else if пригодится, если вы хотите сначала что-то проверить, и только если это приведет к false, вы хотите проверить что-то еще как резерв.
Смежные вопросы