Enum of long values in C#

前端 未结 5 1753
忘掉有多难
忘掉有多难 2021-02-18 13:31

Why does this declaration,

public enum ECountry : long
{
    None,
    Canada,
    UnitedStates
}

require a cast for any of its values?

         


        
相关标签:
5条回答
  • 2021-02-18 14:11

    From MSDN:

    In this example, the base-type option is used to declare an enum whose members are of the type long. Notice that even though the underlying type of the enumeration is long, the enumeration members must still be explicitly converted to type long using a cast.

    // keyword_enum2.cs
    // Using long enumerators
    using System;
    public class EnumTest
    {
        enum Range :long {Max = 2147483648L, Min = 255L};
        static void Main()
        {
            long x = (long)Range.Max;
            long y = (long)Range.Min;
            Console.WriteLine("Max = {0}", x);
            Console.WriteLine("Min = {0}", y);
        }
    }
    

    Output

    Max = 2147483648 Min = 255

    0 讨论(0)
  • 2021-02-18 14:17

    The issue is not that the underlying type is still int. It's long, and you can assign long values to the members. However, you can never just assign an enum value to an integral type without a cast. This should work:

    public enum ECountry : long
    {
        None,
        Canada,
        UnitedStates = (long)int.MaxValue + 1;
    }
    
    // val will be equal to the *long* value int.MaxValue + 1
    long val = (long)ECountry.UnitedStates;
    
    0 讨论(0)
  • 2021-02-18 14:24

    AFAIK, you have got to cast.

    The MSDN article says:

    "However, an explicit cast is needed to convert from enum type to an integral type" (either int or long)

    You can check it out:

    Enumeration types (C# reference)

    0 讨论(0)
  • 2021-02-18 14:28

    The default underlying type of enum is int. An enum can be any integral type except char.

    If you want it to be long, you can do something like this:

    // Using long enumerators
    using System;
    public class EnumTest 
    {
        enum Range :long {Max = 2147483648L, Min = 255L};
        static void Main() 
        {
            long x = (long)Range.Max;
            long y = (long)Range.Min;
            Console.WriteLine("Max = {0}", x);
            Console.WriteLine("Min = {0}", y);
        }
    }
    

    The cast is what is important here. And as @dlev says, the purpose of using long in an enum is to support a large number of flags (more than 32 since 2^32 is 4294967296 and a long can hold more than 2^32).

    0 讨论(0)
  • 2021-02-18 14:29

    You must cast an enum to get a value from it or it will remain an enum type.

    0 讨论(0)
提交回复
热议问题