Search code examples
c#.netenumscastingreturn-value

Can I avoid casting an enum value when I try to use or return it?


If I have the following enum:

public enum ReturnValue{
    Success = 0,
    FailReason1 = 1,
    FailReason2 = 2
    //Etc...
}

Can I avoid casting when I return, like this:

public static int main(string[] args){
    return (int)ReturnValue.Success;
}

If not, why isn't an enum value treated as an int by default?


Solution

  • enums are supposed to be type safe. I think they didn't make them implicitly castable to discourage other uses. Although the framework allows you to assign a constant value to them, you should reconsider your intent. If you primarily use the enum for storing constant values, consider using a static class:

    public static class ReturnValue
    {
        public const int Success = 0;
        public const int FailReason1 = 1;
        public const int FailReason2 = 2;
        //Etc...
    }
    

    That lets you do this.

    public static int main(string[] args){
        return ReturnValue.Success;
    }
    

    EDIT

    When you do want to provide values to an enum is when you want to combine them. See the below example:

    [Flags] // indicates bitwise operations occur on this enum
    public enum DaysOfWeek : byte // byte type to limit size
    {
        Sunday = 1,
        Monday = 2,
        Tuesday = 4,
        Wednesday = 8,
        Thursday = 16,
        Friday = 32,
        Saturday = 64,
        Weekend = Sunday | Saturday,
        Weekdays = Monday | Tuesday | Wednesday | Thursday | Friday
    }
    

    This enum can then be consumed by using bitwise math. See the below example for some applications.

    public static class DaysOfWeekEvaluator
    {
        public static bool IsWeekends(DaysOfWeek days)
        {
            return (days & DaysOfWeek.Weekend) == DaysOfWeek.Weekend;
        }
    
        public static bool IsAllWeekdays(DaysOfWeek days)
        {
            return (days & DaysOfWeek.Weekdays) == DaysOfWeek.Weekdays;
        }
    
        public static bool HasWeekdays(DaysOfWeek days)
        {
            return ((int) (days & DaysOfWeek.Weekdays)) > 0;
        }
    
        public static bool HasWeekendDays(DaysOfWeek days)
        {
            return ((int) (days & DaysOfWeek.Weekend)) > 0;
        }
    }