[英]“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.