Why do "Not all code paths return a value" with a switch statement and an enum?

.net, c#, c#-3.0, enums, visual-studio-2008

Solution

There's nothing to say that the value of `myEnum` will be one of those values.

Don't mistake enums for being a restrictive set of values. It's really just a named set of values. For example, I could call your method with:

int x = Method((MyEnum) 127);

What would you want that to do? If you want it to throw an exception you can do that in a default case:

switch (myEnum)
{
    case MyEnum.Value1: return 1;
    case MyEnum.Value2: return 2;
    case MyEnum.Value3: return 3;
    default: throw new ArgumentOutOfRangeException();
}

Alternatively you could use `Enum.IsDefined` upfront, if you want to do some other work before the switch statement. That has the disadvantage of boxing... there are some ways round that, but they're generally more work...

Sample:

public int Method(MyEnum myEnum)
{
    if (!IsDefined(typeof(MyEnum), myEnum)
    {
        throw new ArgumentOutOfRangeException(...);
    }
    // Adjust as necessary, e.g. by adding 1 or whatever
    return (int) myEnum; 
}

This assumes there's an obvious relationship between the underlying values in `MyEnum` and the value you want to return.

Problem

I have the following code: ``` public int Method(MyEnum myEnum) { switch (myEnum) { case MyEnum.Value1: return 1; case MyEnum.Value2: return 2; case MyEnum.Value3: return 3; } } public enum MyEnum { Value1, Value2, Value3 } ``` And I get the error: `"Not all code paths return a value"`. I do not understand how that `switch` statement could ever not jump to one of the specified cases. Can an `enum` somehow be `null`?

Original source