Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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?

like image 527
Matthijs Wessels Avatar asked Jan 15 '10 12:01

Matthijs Wessels


2 Answers

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.

like image 197
Jon Skeet Avatar answered Oct 14 '22 05:10

Jon Skeet


Enums are not limited to values they represent. You can assign this:

MyEnum v = (MyEnum)1000; 

And there would be no problem at all. Add a default to your switch and you'll handle all possible situations.

like image 34
Nick Larsen Avatar answered Oct 14 '22 06:10

Nick Larsen