[英]“Use of unassigned local variable” compiler error for switch statement in C#?
我有以下C#代碼:
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
可能沒有值,具體取決於用戶輸入,因此該如何解決?
理想情況下,如果輸入了未知的動物類型,我想顯示一條錯誤消息,並讓用戶再次輸入該值。
謝謝。
這是修復它的一種方法,它使用遞歸調用而不是捕獲和引發異常,或者使用循環(在這種情況下循環使我的意思難以理解;關於您的工作方式而不是您的工作太多了在做):
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);
}
我還將注意到,使用if (s.Equals("dog", StringComparison.CurrentCultureIgnoreCase))
(或適當的不區分大小寫的比較)將其重構為一個if / else鏈是一種很好的做法,其他文化。 當然,這可能不適用於您的方案(例如,測試/家庭作業應用程序,或僅在您的文化中可能使用的某些應用程序)。
更新:感謝Mennan Kara的想法,如果您的值(例如"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();
}
}
如果需要將它們分開的靈活性,請保留現有的開關。
如果s.ToLower()
是dog
, cat
或rabbit
, animal
沒有任何價值。
對於這種情況,您應該在交換機中添加默認值:
switch (s.ToLower())
{
case "dog":
animal = AnimalTypeEnum.DOG;
break;
case "cat":
animal = AnimalTypeEnum.CAT;
break;
case "rabbit":
animal = AnimalTypeEnum.RABBIT;
break;
default:
animal = ...
break;
}
AnimalTypeEnum animal;
var s = Console.ReadLine();
Console.WriteLine(!Enum.TryParse(s, true, out animal) ? "Not a valid animal" : animal.ToString());
您應該為代碼未知的任何動物設置默認的ENUM
。 您甚至可以編寫代碼來學習新動物。 例如。
switch (s.ToLower())
{
default:
animal = AnimalType.Unkown;
break;
}
要么
default:
animal = new MakeEnum(s.ToLower());
myEnumList.Add(animal);
break;
您的MakeEnum
基本上只需要檢查當前枚舉數的長度,並使用number或其他一些參數創建一個新的枚舉。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.