C#中的枚举类型

5
当我们创建枚举类型的变量并将其分配为枚举值时。
enum Members{HighlyQualified, Qualified, Ordinary}
class
{
static void Main()
{
 Members developers = Members.HighlyQualified;
 Console.WriteLine(developers);//write out HighlyQualified
}
}

由于枚举是值类型,因此开发人员的值存储在堆栈上,由Members.HighlyQualified返回。在这里,我们清楚地知道开发人员的值是字符串,该字符串引用字符的内存位置。

现在,

1.如果我们将Members.HighlyQualifed转换为int,则返回的值为0。它是如何发生的?

2.枚举类型的实际存储在堆栈上的值是什么?


1
你有阅读文档吗?里面都有详细的解释。 - Charles Mager
1
你应该将枚举值视为具有名称的数字。 - Orel Eraki
2个回答

10

在这里我们可以清楚地看出开发人员的值是字符串,其引用了字符的内存位置。

不是这样的。开发人员(developers)的值是Members类型。它通过Console.WriteLine方法转换为字符串。你将调用Console.WriteLine(object)重载,这将装箱该值,然后Console.WriteLine将调用该装箱值上的ToString,并给出适当的枚举值名称。

如果我们将Members.HighlyQualifed强制转换为int,那么返回的值是0。这是怎么回事?

HighlyQualified是在Members中声明的第一个成员,并且你没有分配任何特定的值。默认情况下,C#编译器将0分配给第一个声明的值,然后每次递增1。如果你将Members.Qualified强制转换为int,你会得到1。

枚举类型的实际存储在堆栈上的值是什么?

实际上就是一个数字。(在这种情况下,是一个int,因为这是默认的基础类型。但是堆栈槽有正确的类型 - 枚举类型。)


3

文档解释了底层类型:

默认情况下,枚举中每个元素的底层类型为int。

以及在未显式指定值时如何生成值:

当您没有为枚举器列表中的元素指定值时,这些值会自动递增1。

因此,在您的情况下,声明等效于:

enum Members : int
{
    HighlyQualified = 0, 
    Qualified = 1, 
    Ordinary = 2
}

堆栈上的是枚举类型本身(在这种情况下是“成员”),当您调用Console.WriteLine时,它将调用该类型的ToString方法,根据文档,返回一个包含常量名称的字符串。

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