当我们创建枚举类型的变量并为其赋予枚举值
时enum Members{HighlyQualified, Qualified, Ordinary}
class
{
static void Main()
{
Members developers = Members.HighlyQualified;
Console.WriteLine(developers);//write out HighlyQualified
}
}
由于enum是值类型,因此开发人员的值存储在由Members.HighlyQualified返回的堆栈上。我们很清楚开发人员的值是字符串,它引用了字符的内存位置。
现在,
1.如果我们将Members.HighlyQualifed转换为int,则返回的值为0。 怎么回事?
2.对于枚举类型,什么值实际存储在堆栈上?
答案 0 :(得分: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
因为这是默认的底层类型。但堆栈槽的类型正确 - 枚举类型。
答案 1 :(得分:3)
The documentation解释了基础类型:
默认情况下,枚举中每个元素的基础类型为int。
以及未明确指定时如何生成值:
如果未在枚举器列表中指定元素的值,则值将自动递增1.
因此,在您的情况下,声明等同于:
enum Members : int
{
HighlyQualified = 0,
Qualified = 1,
Ordinary = 2
}
堆叠上的内容是enum
类型本身(在这种情况下为Members
),当您致电Console.WriteLine
时,它会调用ToString
,为此, per the docs for that,返回:
包含常量
名称的字符串