11

我有一个像这样的枚举:

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

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

int a = Test.A;

这不起作用。

如果我有这样的课程:

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

我可以说 ,

int a = MyTest.A;

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

4

5 回答 5

18

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

不,这不对。它有一个基础类型int,但它是一个单独的类型。哎呀,这是首先拥有枚举的一半 - 您可以将类型分开。

当你想在一个枚举值和它的数字等价物之间进行转换时,你可以强制转换——这并不痛苦,而且它可以让你的代码在类型安全方面更清晰。基本上,这是其中一件事情,因为它是正确的事情的稀有性使得它适合明确。

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

Test foo = 0;

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

Test surprise = 0.0;

这是一个错误,但修复为时已晚:)

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

于 2012-08-15T12:01:23.040 回答
3

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

于 2012-08-15T12:01:51.123 回答
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 值,但 和 的值A仍然B被强类型化为 type MyTest。这样可以确保您不会在不合适的地方意外使用它们。

于 2012-08-15T12:39:42.463 回答
2

你的枚举是类型Test。这int不仅仅是因为您的枚举具有整数值。

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

int a = (int) Test.A;
于 2012-08-15T12:02:24.087 回答