&引用;使用未分配的局部变量;C#中switch语句的编译器错误?

&引用;使用未分配的局部变量;C#中switch语句的编译器错误?,c#,enums,io,switch-statement,C#,Enums,Io,Switch Statement,我有以下C#代码: 我在最后一行得到这个错误:使用未分配的局部变量“animal”。我知道这是因为animal可能没有一个值,这取决于用户的输入,那么我该如何解决这个问题呢 理想情况下,如果输入了未知的动物类型,我希望显示一条错误消息,并让用户再次输入该值 谢谢。如果s.ToLower()是另一个狗,猫或兔子,动物没有价值 对于这种情况,您应该在交换机中添加默认值: switch (s.ToLower()) { case "dog": animal = AnimalTypeEnum.DO

我有以下C#代码:

我在最后一行得到这个错误:
使用未分配的局部变量“animal”
。我知道这是因为
animal
可能没有一个值,这取决于用户的输入,那么我该如何解决这个问题呢

理想情况下,如果输入了未知的动物类型,我希望显示一条错误消息,并让用户再次输入该值

谢谢。

如果
s.ToLower()
是另一个
兔子
动物
没有价值

对于这种情况,您应该在交换机中添加默认值:

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

这里有一种解决方法,使用递归调用,而不需要捕获和抛出异常,或者使用循环(在我看来,这种情况下的循环混淆了含义;太多关于如何做而不是你在做什么):

我还将注意到,使用
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();
    }
}

如果您需要灵活地将它们分开,则保留现有开关。

对于代码未知的任何动物,您应该有一个默认的
ENUM
。你甚至可以编写代码来学习新的动物。比如说

AnimalTypeEnum animal;
var s = Console.ReadLine();
Console.WriteLine(!Enum.TryParse(s, true, out animal) ? "Not a valid animal" : animal.ToString());
switch (s.ToLower())
{
default:
    animal = AnimalType.Unkown;
    break;
}


您的
MakeEnum
基本上只需要检查当前枚举数的长度,并使用该数或其他一些参数创建一个新的枚举。

添加一个
default:
子句。Ref:但是在默认情况下,我不想给
animal
一个值,我想再次输入该值。@Dr.stevenbrule然后抛出一个异常。然后,您可以捕获异常并要求他使用另一个值。如果您想再次询问,则需要将其放入循环中。这里的异常是一个错误的建议。@Henkholtman如果我写的代码在一个方法中从
字符串返回
AnimalTypeEnum
,那么
ArgumentException
怎么会是一个错误的建议呢?你没有写这个方法。因为它正在处理用户输入,所以它应该是
booltrygetanimaltypefromstring(…)
AnimalTypeEnum animal;
var s = Console.ReadLine();
Console.WriteLine(!Enum.TryParse(s, true, out animal) ? "Not a valid animal" : animal.ToString());
switch (s.ToLower())
{
default:
    animal = AnimalType.Unkown;
    break;
}
default:
    animal = new MakeEnum(s.ToLower());
    myEnumList.Add(animal);
    break;