c#长值的枚举

时间:2011-08-17 13:06:48

标签: c# enums

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

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
}

5 个答案:

答案 0 :(得分:27)

问题是基础类型仍为int。它是long,您可以为成员分配long值。但是,您可以从不只将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;

答案 1 :(得分:7)

enum的默认基础类型为int。除enum外,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所说,在long中使用enum的目的是支持大量的标志(超过32,因为2 ^ 32是4294967296而long可以容纳更多比2 ^ 32)。

答案 2 :(得分:5)

必须投射枚举以从中获取值,否则它将保持enum类型

答案 3 :(得分:2)

From 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

答案 4 :(得分:1)

你要投AFAIK。

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

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