C#中的长整型枚举

28

为什么这个声明语句,

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
为什么会需要拥有超过40亿个枚举值? - Yuck
32
@Yuck:重要的不是枚举值的数量,而是该枚举中所包含的实际值。我不知道你的评论为什么会被点赞至少4次,因为它没有意义。 - user195488
35
您不太可能需要超过40亿个枚举值,但您可能需要更多于32个标志。 - stevemegson
1
@Yuck,枚举可能表示来自其他系统的大量数字值。(尽管在给定的示例中并没有这样做)。 - Jon Egerton
2
@Yuck,我认为他的观点一点也不好。更改enum的基础类型的主要原因是支持具有超过32个项目的“Flags”枚举。您可以将其用于存储随机的long值,但这种情况较少见,而且有点不好。 - dlev
显示剩余5条评论
5个回答

43
问题不在于基础类型仍然是int。它是long,您可以将long值分配给成员。但是,您永远不能直接将枚举值分配给积分类型而不使用转换。这应该可以工作:
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;

然而,你不能仅仅将枚举值分配给整数类型而不进行强制转换。请问可以解释一下原因吗? - CosmicGiant
@CosmicGiant:因为枚举不应该有“有意义”的值,它们只应该支持一些排序。如果你想要执行算术运算,那么你应该使用常量。 - Ferazhu

10

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所说,在enum中使用long的目的是支持大量标志(超过32个,因为2^32是4294967296,而long可以容纳超过2^32)。


7

您必须将枚举类型转换为其值才能使用,否则它仍然是一个enum类型。


2
在这个例子中,使用base-type选项声明了一个枚举类型,其成员的类型为long。请注意,即使枚举的基础类型是long,枚举成员仍必须显式转换为long类型使用强制转换。此内容来源于MSDN
// 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


1

据我所知,你必须进行强制转换。

MSDN文章中说:

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

你可以查看一下:

枚举类型(C#参考)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接