这是修复它的一种方法,使用递归调用而不是需要捕获和抛出异常,或者使用循环(在这种情况下循环混淆了我认为的含义;太多关于你如何做而不是你做什么'正在做):
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);
}
我还要注意,将 switch 重构为 if/else 链是一种很好的做法,使用if (s.Equals("dog", StringComparison.CurrentCultureIgnoreCase))
(或适当的不区分大小写的比较)以使其在其他文化中正常工作。当然,这可能不适用于您的场景(例如测试/家庭作业应用程序,或仅可能在您的文化中使用的东西)。
更新:感谢 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();
}
}
如果您需要将它们分开的灵活性,请保留现有的开关。