能否将整数转换为枚举类型?

31

我得到了以下枚举:

 public enum detallistaDocumentStatus {

    /// <remarks/>
    ORIGINAL,

    /// <remarks/>
    COPY,

    /// <remarks/>
    REEMPLAZA,

    /// <remarks/>
    DELETE,
}

然后我获得了一个类型为detallistaDocumentStatus的类属性:

 public detallistaDocumentStatus documentStatus {
        get {
            return this.documentStatusField;
        }
        set {
            this.documentStatusField = value;
        }
    }
在现实生活中,用户将按照它们声明的顺序发送表示每个枚举值的数字(1、2、3或4)。
那么,可以像这样转换吗?
det.documentStatus = (detallistaDocumentStatus)3;

如果不行的话,我该如何使用整数作为索引来获取枚举值?我们使用了很多枚举,所以我们希望做一些通用和可重复使用的事情。


5
如果您计划像这样使用枚举值,我建议为您的枚举值明确指定值。 - Yuck
22
我会开始把这句话作为我的默认评论:你试过了吗?如果试过,发生了什么? - Chris Shain
3
给这样的问题点赞让我感到困惑。 - Andrew Barber
4
让我困惑的是,为什么有些人会花时间在 Stack Overflow 上提问,而不是在他们的 IDE 中查找答案。我相信 VS 2010 对于回答这个问题的响应速度要比我们快得多。 - Chris Shain
2
标题与问题完全相反并不利于获得答案。 - Alexei Levenkov
枚举返回 int 值的问题 - nawfal
6个回答

51

是的,可以将 Enum 强制转换为 int 或反过来进行转换,因为每个默认情况下都由一个 int 表示。您应该手动指定成员值。默认情况下,它从 0 到 N 开始。

也可以将 Enum 强制转换为 string 或反过来进行转换。

public enum MyEnum
{
    Value1 = 1,
    Value2 = 2,
    Value3 = 3
}

private static void Main(string[] args)
{
    int enumAsInt = (int)MyEnum.Value2; //enumAsInt == 2

    int myValueToCast = 3;
    string myValueAsString = "Value1";
    MyEnum myValueAsEnum = (MyEnum)myValueToCast;   // Will be Value3

    MyEnum myValueAsEnumFromString;
    if (Enum.TryParse<MyEnum>(myValueAsString, out myValueAsEnumFromString))
    {
        // Put logic here
        // myValueAsEnumFromString will be Value1
    }

    Console.ReadLine();
}

假设您没有将枚举定义为 public enum MyEnum: long,否则强制转换为 int 可能会导致截断。 - Chris Shain
由于问题的标题是关于将枚举转换为整数,而标记的答案实际上并没有包括代码示例的一部分,因此我添加了它。 - AaronLS
4
虽然没有必要,但我强烈建议为枚举中的每个成员分配一个整数值。如果不这样做,第一个成员的值为0,第二个为1,一直到N。问题是有些环境会对你的枚举进行排序,而另一些则不会。这将导致在不同的环境中得到不同的整数值。对于我来说,在我的生产环境中对枚举进行了排序,而在我的本地主机上没有进行排序。这在生产环境中导致了一个错误,但在开发环境中我无法重现。 - Bob

14

来自C# 4.0规范:

1.10 枚举

可以使用类型转换将枚举值转换为整数值,反之亦然。例如:

int i = (int)Color.Blue;      // int i = 2;
Color c = (Color)2;               // Color c = Color.Blue;
在使用枚举类型时,需要注意的一点是,你可以将任何在枚举类型底层类型范围内(默认为int)的整数值强制转换为该枚举类型,即使该值不映射到枚举声明中的任何名称。摘自1.10 枚举类型的说明:
枚举类型可以采用的值集合不受其枚举成员的限制。特别地,枚举类型的底层类型的任何值都可以强制转换为该枚举类型,并且是该枚举类型的一个不同的有效值。
因此,以下内容在您示例中的枚举中也是允许的:
det.documentStatus = (detallistaDocumentStatus) 42;

尽管没有枚举名称的值为42


13

是的,这是可能的。我使用以下ENUM

public enum AccountTypes
{
  Proposed = 1,
  Open = 2
}

然后当我调用它时,我使用这个来获取值:

(int)AccountTypes.Open

同时它会返回我所需要的整数值,对于上述代码将会是2。


4
OP试图反过来做。他有一个整数值,需要找到相应的枚举值。 - Yuck
啊,我现在明白了,感谢你指出来。这仍然可以用来判断提交的值是否等于枚举的值。 - Taryn

1
det.documentStatus = (detallistaDocumentStatus)3;

以上代码应该可以正常工作。需要记住的是,如果您为枚举成员分配特定数字,则像这样的操作可能无法按预期工作。此外,如果您没有显式编号枚举值,则枚举成员从基于零的索引开始。

因此,上述代码将按声明顺序分配枚举的第四个成员。

要检查给定整数是否为该枚举的有效枚举值,请使用Enum.IsDefined


1
如果您为枚举成员提供了显式的整数值,就像这样:
public enum Foo
{
    Five=5
    , Six
    , Seven
    , Eight
}

你可以将它们强制转换为 int 类型以获取隐式值。

var bar = (int)Foo.Six: /// bar == 6

如果您没有为至少第一个值明确定义一个值,则将其转换为int将为您提供它在声明中出现的顺序。


-1

枚举类型只是一种方便地为整数命名的方式。枚举类型的值可以像 int 一样进行加、减和比较。


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