2012-07-29 24 views
-1

我有以下的C#代碼:C#中switch語句的「使用未分配的本地變量」編譯器錯誤?

AnimalTypeEnum animal; 
string s = Console.ReadLine(); 
switch (s.ToLower()) 
{ 
case "dog": 
    animal = AnimalTypeEnum.DOG; 
    break; 
case "cat": 
    animal = AnimalTypeEnum.CAT; 
    break; 
case "rabbit": 
    animal = AnimalTypeEnum.RABBIT; 
    break; 
} 

Console.WriteLine(animal); #compiler error here 

我得到這個錯誤在最後一行:Use of unassigned local variable 'animal'。我知道這是因爲animal可能沒有取決於用戶輸入的值,所以我該如何解決這個問題?

理想情況下,如果輸入了未知動物類型並讓用戶再次輸入值,我想顯示錯誤消息。

謝謝。

+2

添加'default:'子句。參考:http://msdn.microsoft.com/en-us/library/06tc147t.aspx – Joe 2012-07-29 12:46:26

回答

4

這裏有一種方法來解決它,使用遞歸調用,而不是需要捕捉並拋出異常,或在情況下使用循環(循環像這樣的混淆在我看來意義;太多關於你怎麼做,而不是你在做什麼)吧:

private static AnimalTypeEnum GetAnimalFromInput() 
{ 
    AnimalTypeEnum animal; 
    string s = Console.ReadLine(); 
    switch (s.ToLower()) 
    { 
     case "dog": 
      animal = AnimalTypeEnum.DOG; 
      break; 
     case "cat": 
      animal = AnimalTypeEnum.CAT; 
      break; 
     case "rabbit": 
      animal = AnimalTypeEnum.RABBIT; 
      break; 
     default: 
      Console.WriteLine(s + " is not valid, please try again"); 
      animal = GetAnimalFromInput(); 
      break; 
    } 
    return animal; 
} 
static void Main(string[] args) 
{ 
    AnimalTypeEnum animal = GetAnimalFromInput(); 

    Console.WriteLine(animal); 
} 

我還會注意到,它是很好的做法,重構你的交換機成如果/ else鏈,使用if (s.Equals("dog", StringComparison.CurrentCultureIgnoreCase))(或適當的不區分大小寫比較)來保持它在其他文化中的工作。當然,這可能不適用於您的場景(例如,測試/家庭作業應用程序,或僅可能用於您的文化的內容)。


更新:感謝Mennan卡拉的想法,如果你的價值觀(如"dog")將始終匹配枚舉的值(例如DOG),那麼你可以使用Enum.TryParse改進代碼:

private static AnimalTypeEnum GetAnimalFromInput() 
{ 
    AnimalTypeEnum animal; 
    string s = Console.ReadLine(); 
    if (Enum.TryParse(s, true, out animal)) 
     return animal; 
    else 
    { 
     Console.WriteLine(s + " is not valid, please try again"); 
     return GetAnimalFromInput(); 
    } 
} 

如果您需要將它們分開的靈活性,請保留現有的開關。

2

如果s.ToLower()是別的東西dogcatrabbitanimal沒有價值。

你應該在你開關添加默認的話:

switch (s.ToLower()) 
{ 
case "dog": 
    animal = AnimalTypeEnum.DOG; 
    break; 
case "cat": 
    animal = AnimalTypeEnum.CAT; 
    break; 
case "rabbit": 
    animal = AnimalTypeEnum.RABBIT; 
    break; 
default: 
    animal = ... 
    break; 
} 
+0

但在默認情況下,我不想給'動物'一個值,我想要再次輸入值。 – 2012-07-29 12:48:33

+0

@ Dr.SteveBrule然後拋出異常。然後你可以捕捉異常並要求他使用另一個值。 – ken2k 2012-07-29 12:49:29

+0

如果你想再問一次,你需要把它放在一個循環中。在這裏,例外是一個不好的建議。 – 2012-07-29 12:53:34

2
AnimalTypeEnum animal; 
var s = Console.ReadLine(); 
Console.WriteLine(!Enum.TryParse(s, true, out animal) ? "Not a valid animal" : animal.ToString()); 
0

你應該有任何動物未知代碼默認ENUM。你甚至可以讓你的代碼學習新的動物。例如。

switch (s.ToLower()) 
{ 
default: 
    animal = AnimalType.Unkown; 
    break; 
} 

default: 
    animal = new MakeEnum(s.ToLower()); 
    myEnumList.Add(animal); 
    break; 

MakeEnum基本上只需要檢查枚舉當前數量的長度,並使用數字或其他一些參數的新枚舉。

相關問題