c#长值的枚举

我想知道为什么这个宣言:

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

需要为其任何值进行演员表?

 long ID = ECountry.Canada; // Error Cannot implicitly convert type 'ECountry' to 'long'. // An explicit conversion exists (are you missing a cast?) 

除了演员之外,还有什么方法可以直接从枚举中获取长值吗?

这不会起作用,例如:

 public enum ECountry : long { None = 0L, Canada = 1L, UnitedStates=2L } 

问题在于底层类型仍然是int 。 它很long ,您可以为成员分配long值。 但是,您永远不能只在没有 enum转换的情况下将enum值分配给整数类型。 这应该工作:

 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; 

enum的默认底层类型是intenum可以是除char之外的任何整数类型。

如果你想要它很long ,你可以做这样的事情:

 // 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); } } 

演员阵容在这里很重要。 正如@dlev所说,在enum中使用long的目的是支持大量的标志(超过32,因为2 ^ 32是4294967296,而long可以容纳超过2 ^ 32)。

必须使用枚举来获取它的值,否则它将保持enum类型

来自msdn

在此示例中,base-type选项用于声明其成员的类型为long的枚举。 请注意,即使枚举的基础类型很长,枚举成员仍必须使用强制转换显式转换为long类型。

 // 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); } } 

产量

最大值= 2147483648最小值= 255

AFAIK你得演员。

MSDN文章说:“但是,需要显式转换才能从枚举类型转换为整数类型”(int或long)

你可以看一下: https : //docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/enum