为什么我们需要在C#中输入一个枚举枚举

时间:2012-08-15 11:58:45

标签: c#

我有一个类似的枚举:

public enum Test:int
{
   A=1, 
   B=2
}

所以在这里我知道我的enum是一个int类型,但如果我想做类似下面的事情:

int a = Test.A;

这不起作用。

如果我有一个类:

public class MyTest
{
    public static int A =1;
}

我可以说,

int a = MyTest.A;

这里我不需要明确地将A强制转换为int。

5 个答案:

答案 0 :(得分:18)

  

所以我知道我的枚举是一个int类型

不,不是。它有底层类型int,但它是一个单独的类型。哎呀,这首先是枚举的一半 - 你可以将这些类型分开。

如果你想在枚举值和它的数字等价物之间进行转换,那么你就可以进行转换 - 这并不是那么痛苦,它可以使你的代码在类型安全方面更加清晰。基本上,它是其中一个罕见的事情,即正确的事情,使它适合于明确。

编辑:您应该注意的一个奇怪之处是从常量值0到枚举类型的隐式转换:

Test foo = 0;

事实上,在MS实现中,它可以是任何类型的常量0:

Test surprise = 0.0;

这是一个错误,但是修复已经太晚了。)

我相信这个隐式转换的其余部分是为了更简单地检查是否在标志枚举中设置了任何位,以及使用“0值”的其他比较。就个人而言,我不是那个决定的粉丝,但至少值得注意它。

答案 1 :(得分:5)

答案 2 :(得分:3)

枚举值不是int类型。 int是枚举的基本类型。枚举在技术上是整数,但逻辑上(从C#语言的角度来看)不是。 intSystem.Int32)默认情况下是所有枚举的基本类型,如果您没有明确指定另一个枚举。

答案 3 :(得分:3)

使用您更新的示例:

public class MyTest
{
    public static int A =1;
}

用法:

int a = MyTest.A;

这是枚举的样子。枚举看起来更像(评论是我们与真实枚举不同的地方):

public struct MyTest /* Of course, this isn't correct, because we'll inherit from System.ValueType. An enum should inherit from System.Enum */
{
    private int _value; /* Should be marked to be treated specially */
    private MyTest(int value) /* Doesn't need to exist, since there's some CLR fiddling */
    {
       _value = value;
    }

    public static explicit operator int(MyTest value) /* CLR provides conversions automatically */
    {
       return value._value;
    }
    public static explicit operator MyTest(int value) /* CLR provides conversions automatically */
    {
       return new MyTest(value);
    }

    public static readonly MyTest A = new MyTest(1); /* Should be const, not readonly, but we can't do a const of a custom type in C#. Also, is magically implicitly converted without calling a constructor */

    public static readonly MyTest B = new MyTest(2); /* Ditto */
}

是的,您可以轻松获取“基础”int值,但AB的值仍然强类型为{{1} }}。这样可以确保您不会意外在不合适的地方使用它们。

答案 4 :(得分:2)

您的枚举类型为Test。它不是int只是因为你的枚举有整数值。

您可以转换枚举以获取int值:

int a = (int) Test.A;