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

Emb*_*rja 11 c#

我有一个像:

public enum Test:int
{
   A=1, 
   B=2
}
Run Code Online (Sandbox Code Playgroud)

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

int a = Test.A;
Run Code Online (Sandbox Code Playgroud)

这不起作用.

如果我有一个类:

public class MyTest
{
    public static int A =1;
}
Run Code Online (Sandbox Code Playgroud)

我可以说 ,

int a = MyTest.A;
Run Code Online (Sandbox Code Playgroud)

在这里,我不需要A明确地转换为int.

Jon*_*eet 18

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

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

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

编辑:一个怪胎,你应该知道的是,有从恒定值0到枚举类型的隐式转换:

Test foo = 0;
Run Code Online (Sandbox Code Playgroud)

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

Test surprise = 0.0;
Run Code Online (Sandbox Code Playgroud)

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

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

  • @Praveen:不,枚举不是int.枚举的*存储表示*为int,但它是一个单独的类型.你*不应该像没有明确这样做的那样使用它... (2认同)

Dam*_*ver 3

使用您更新的示例:

public class MyTest
{
    public static int A =1;
}
Run Code Online (Sandbox Code Playgroud)

及用法:

int a = MyTest.A;
Run Code Online (Sandbox Code Playgroud)

枚举不是这样的枚举看起来更像(注释是我们与真实枚举不同的地方):

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 */
}
Run Code Online (Sandbox Code Playgroud)

是的,您可以轻松获取“底层” int 值,但A和的值B仍然是强类型的类型MyTest。这可以确保您不会意外地将它们用在不合适的地方。