2016-03-01 43 views
2

因此,我是C#的初學者,我真的不知道爲什麼我要爲變量「名稱」使用「未分配的本地變量錯誤」。我有這個簡單的代碼要求提供一個名稱,如果它不是Bob或Alice,它會顯示一條消息。使用未分配的本地變量錯誤的指定字符串

using System; 

namespace exercise2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string name; 
      int i = 0; 
      while (i == 0) 
      { 
       Console.Write("What is your name?\n>>> "); 
       name = Console.ReadLine(); 
       if ((name == "Alice") || (name == "Bob")) 
       { 
        i = 1; 
        Console.Clear(); 
       } 
       else 
       { 

        Console.WriteLine("You're not Alice or Bob."); 
        Console.ReadKey(); 
        i = 0; 
        Console.Clear(); 
       } 

      } 
      Console.WriteLine("Good Morning, " + name); //"name" is unassigned 
      Console.ReadKey(); 
     } 
    } 
} 

希望這不是一個愚蠢的問題。

感謝

回答

2

這是因爲編譯器不能「看到」上while()聲明評價肯定會truename將在while塊的第一次分配。

更改

string name; 

string name = ""; //or string.Empty 

雖然作爲人,我們可以讀出輕鬆的,而塊將會首次被執行:

string name; //unassigned 
int i = 0; 
while (i == 0) //will enter 
{ 
    Console.Write("What is your name?\n>>> "); 
    name = Console.ReadLine(); //name will definitely be assigned here 
    ... something else 
} 
Console.WriteLine("Good Morning, " + name); //compiler cannot "see" that the while loop will definitely be entered and name will be assigned. Therefore, "name" is unassigned 

編譯器無法看到,從而給你錯誤。

或者,您也可以改變whiledo-while強制編譯器看到,name將被分配(幸得Lee):

​​
+3

改變環路成'不要while'也應該工作。 – Lee

+0

@Lee更新並記入你...;) – Ian

+0

謝謝!這工作。我不明白的是,離開while模塊的唯一方法不僅是當它是真的,這意味着名稱將被分配?如果這是有道理的 – lfsando

1

名變量是在一些點未分配可以使用的分支過程。你可以給它分配一個默認值,但重構它是一個更好的解決方案。

在while循環中移動name變量以避免重新分配。 (在技術上把它放在while循環中不是重新分配同一個變量,因爲當它再次循環時,會創建一個新變量並且以前的設置值不可用)。

下面兩行遷入條件的真實部分:

Console.WriteLine("Good Morning, " + name); 

Console.ReadKey(); 

static void Main(string[] args) 
    { 

     int i = 0; //this should really be bool, 
     //because all you're doing is using 0 for repeat and 1 for stop. 
     while (i == 0) 
     { 
      Console.Write("What is your name?\n>>> "); 
      string name = Console.ReadLine(); 
      if ((name == "Alice") || (name == "Bob")) 
      { 
       i = 1; 
       Console.Clear(); 
       Console.WriteLine("Good Morning, " + name); //"name" is unassigned 
       Console.ReadKey(); 
      } 
      else 
      { 

       Console.WriteLine("You're not Alice or Bob."); 
       Console.ReadKey(); 
       i = 0; 
       Console.Clear(); 
      } 

     } 

    } 
} 
相關問題