Filip Vancevski
Filip Vancevski

Reputation: 37

C# how to convert string input from console to an enum

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

Answers (4)

aronsini
aronsini

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

Michael Gunter
Michael Gunter

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

Abion47
Abion47

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

Psi
Psi

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

Related Questions