-1

我有以下 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根据用户输入可能没有值,那么我该如何解决呢?

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

谢谢。

4

4 回答 4

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);
}

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

如果您需要将它们分开的灵活性,请保留现有的开关。

于 2012-07-29T12:51:40.950 回答
2

万一是, or ,没有价值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;
}
于 2012-07-29T12:47:00.210 回答
2
AnimalTypeEnum animal;
var s = Console.ReadLine();
Console.WriteLine(!Enum.TryParse(s, true, out animal) ? "Not a valid animal" : animal.ToString());
于 2012-07-29T12:58:59.807 回答
0

您应该为您的代码ENUM未知的任何动物设置默认值。你甚至可以编写代码来学习新动物。例如。

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

或者

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

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

于 2012-07-29T13:19:04.020 回答