我试图通过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;
答案 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
}