C#如何将字符串输入从控制台转换为枚举

时间:2017-03-13 16:44:36

标签: c#

我试图通过Console.ReadLine()转换我从用户那里收到的字符串;进入枚举,这是我到目前为止尝试的代码。我一直在使用未分配的局部变量得到错误,欢迎任何建议。

static Manager CreateNewManager()
    {
        Console.Write("Insert Id: ");
        int managerID = int.Parse(Console.ReadLine());

        Console.Write("Insert First Name: ");
        string firstName = Console.ReadLine();

        Console.Write("Insert Last Name: ");
        string lastName = Console.ReadLine();

        Console.Write("Insert Department");
        string department = Console.ReadLine();

        Console.Write("Select gender (M or F): ");
        string gender = Console.ReadLine();
        Gender genderEnum;
        if(gender == "M")
        {

             genderEnum = Gender.Male;
        }
        else if (gender == "F")
        {
             genderEnum = Gender.Female;
        };

        Console.Write("Insert Salary");
        int salary = int.Parse(Console.ReadLine());

        Manager newManager = new Manager(managerID, department, salary, firstName, lastName, genderEnum);
        return newManager;

3 个答案:

答案 0 :(得分:2)

我想详细说明之前的答案。有三种典型的方法:

1)在你的枚举中声明Unknown(按照之前的答案)。这方面的缺点是它可能具有深远的影响。例如,您在处理输入时可能只有这个特定的Unknown条件,但您可能需要在整个应用程序中使用Gender枚举,包括许多Unknown根本不是有效值。通过在枚举中声明Unknown成员,很难查看远离此输入代码的一段代码,并确定是否需要处理Unknown选项。

enum Gender { Male, Female, Unknown }

...

Gender genderEnum;
if (gender == "M")
    genderEnum = Gender.Male;
else if (gender == "F")
    genderEnum = Gender.Female;
else
    genderEnum = Gender.Unknown;

2)使用Nullable。以下示例使用? syntax。这种方法的好处是你有一个更清晰的枚举。您的代码中可能有许多地方,其中"未知"性别是不可能的。例如,如果您评估输入一次并拒绝任何无效的性别,那么任何需要有效性别的代码都不需要担心第三种选择。需要明确定义的特定性别的代码可以使用Gender,使用可能未知的性别的代码可以使用Gender?

enum Gender { Male, Female }

...

Gender? genderEnum;
if (gender == "M")
    genderEnum = Gender.Male;
else if (gender == "F")
    genderEnum = Gender.Female;
else
    genderEnum = null;

3)抛出异常。这样做的好处是你立即拒绝无效输入。确保妥善处理您的例外情况。

enum Gender { Male, Female }

...

Gender genderEnum;
if (gender == "M")
    genderEnum = Gender.Male;
else if (gender == "F")
    genderEnum = Gender.Female;
else
    throw new ApplicationException("Invalid gender input.");

答案 1 :(得分:1)

看看那段代码:

    Gender genderEnum;
    if(gender == "M")
    {

         genderEnum = Gender.Male;
    }
    else if (gender == "F")
    {
         genderEnum = Gender.Female;
    };

如果用户输入的内容不同于' M'或者' F'?仍然不会分配genderEnum。但无论如何你试着用它:

Manager newManager = new Manager(managerID, department, salary, firstName, lastName, genderEnum);

这会导致编译错误。

初始化您的genderEnum(并将该案例Unknown添加到您的enum Gender):

Gender genderEnum = Gender.Unknown;

答案 2 :(得分:1)

C#要求保证在引用它们之前分配所有局部变量。因为您在没有实例化的情况下声明genderEnum

Gender genderEnum;

您需要确保在引用它的行之前为其分配了值:

Manager newManager = new Manager(managerID, department, salary, firstName, lastName, genderEnum);

然而,在你的if-elseif链中:

if (gender == "M")
{
     genderEnum = Gender.Male;
}
else if (gender == "F")
{
     genderEnum = Gender.Female;
}
如果genderEnum既不是gender也不是"M",那么

"F"可能会没有值。为了使保证成立,您需要在声明时初始化genderEnum

Gender genderEnum = Gender.Unknown; // Or whatever other default value

或者您还需要一个else块:

else
{
    genderEnum = Gender.Unknown; // Or whatever other default value
}