Reputation: 37
I'm trying to convert a string that i receive from the user via Console.ReadLine(); into an enum, this is the code i tried so far. I keep getting the error that im using an unassigned local variable, any advice is welcomed.
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;
Upvotes: 1
Views: 6780
Reputation: 29
I wrote this, maybe is useful for someone.
public function TEnum GetConsoleEnumerator<TEnum>() where TEnum : Enum
{
do
{
Console.Write("option ---> ");
var response = Console.ReadLine().Trim( );
var valueIsContained = Enum.IsDefined(typeof(TEnum), response);
if (!valueIsContained)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Invalid, try again");
Console.ResetColor();
}
else
return (TEnum)Enum.Parse(typeof( TEnum ), response, true);
}
while (true);
}
Upvotes: 0
Reputation: 12811
I'd like to elaborate on previous answers. There are three typical ways of doing this:
1) Declare an Unknown
in your enum (as per previous answers). The downside to this is that it potentially has far-reaching implications. For example, you may only have this particular Unknown
condition when processing input, but you may need to use your Gender
enum all throughout your application, including lots of cases where Unknown
is simply not a valid value. By declaring an Unknown
member in your enum, it becomes difficult to look at a piece of code far away from this input code and determine if you need to handle the Unknown
option.
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) Use a Nullable
. The example below uses the ?
syntax. The upside to this approach is that you have a cleaner enum. There may be many places in your code where this "unknown" gender isn't possible. For example, if you evaluate the input once and reject any invalid genders, then any piece of code which requires a valid gender would not need to worry about a third option. Code that needs a specific well-defined gender can use Gender
and code that uses a potentially unknown gender can use Gender?
.
enum Gender { Male, Female }
...
Gender? genderEnum;
if (gender == "M")
genderEnum = Gender.Male;
else if (gender == "F")
genderEnum = Gender.Female;
else
genderEnum = null;
3) Throw an exception. The upside to this is that you immediately reject invalid input. Make sure you handle your exceptions appropriately.
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.");
Upvotes: 3
Reputation: 24736
C# requires that all local variables are guaranteed to be assigned before they can be referenced. Because you are declaring genderEnum
without instantiating it:
Gender genderEnum;
You need to make sure that it is assigned a value before the line where you reference it:
Manager newManager = new Manager(managerID, department, salary, firstName, lastName, genderEnum);
However, in your if-elseif chain:
if (gender == "M")
{
genderEnum = Gender.Male;
}
else if (gender == "F")
{
genderEnum = Gender.Female;
}
genderEnum
could come away without a value if gender
is neither "M"
or "F"
. In order for the guarantee to hold true, you either need to initialize genderEnum
when you declare it:
Gender genderEnum = Gender.Unknown; // Or whatever other default value
or you need an else block as well:
else
{
genderEnum = Gender.Unknown; // Or whatever other default value
}
Upvotes: 1
Reputation: 6793
Look at that piece of code:
Gender genderEnum;
if(gender == "M")
{
genderEnum = Gender.Male;
}
else if (gender == "F")
{
genderEnum = Gender.Female;
};
What happens if the user enters something different than 'M' or 'F'? genderEnum
would still not be assigned. But you try to use it anyway:
Manager newManager = new Manager(managerID, department, salary, firstName, lastName, genderEnum);
This causes the compiler error.
Initialize your genderEnum (and add that case Unknown
to your enum Gender
):
Gender genderEnum = Gender.Unknown;
Upvotes: 1