对Enum.GetValues()的返回值感到困惑
本文关键字:返回值 Enum GetValues | 更新日期: 2023-09-27 18:01:05
我正在读一本书中关于枚举的内容,给出了以下代码示例:
namespace FunWithEnums
{
enum EmpType : byte
{
Manager = 10,
Grunt = 1,
Contractor = 100,
VicePresident = 9
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("**** Fun with Enums *****");
EmpType emp = EmpType.Contractor;
EvaluateEnum(emp);
Console.ReadLine();
}
static void EvaluateEnum(System.Enum e)
{
Array enumData = Enum.GetValues(e.GetType());
for (int i =0; i < enumData.Length; i++)
{
Console.WriteLine("Name: {0}, Value: {0:D}", enumData.GetValue(i));
}
Console.WriteLine();
}
}
我对forloop中打印的内容感到非常困惑。输出为
名称:Grunt,数值:1
姓名:VicePresident,价值:9
姓名:经理,价值:10
名称:承包商,价值:100
但是,它是如何获得每个枚举元素的名称和值的呢?根据微软的文档,Array enumData = Enum.GetValues(e.GetType());
应该只返回"指定枚举中常量值的数组"。我认为,通过常量,它指的是"经理"、"Grunt"、"承包商"、"VicePresident",而不是10、1、100和9。那么,为什么它会返回每一对,而不仅仅是员工类型的名称呢?此外,以下代码Console.WriteLine(enumData.GetValue(1));
的输出只返回一个值,即"VicePresident",并且不会像在forloop中那样返回数字9。为什么会这样?
Console.WriteLine(String, Object)
使用.NET的"复合格式"功能,当您为其提供枚举值时,它会应用"枚举格式字符串":
G或G
如果可能,否则显示当前的整数值例子
因此,您可以在字符串中嵌入{0:G}
,以替换enum名称。虽然没有提到,但{0:G}
等效于{0}
,这就是您在使用Console.WriteLine("Name: {0},...
的示例中观察到的。
D或D
将枚举条目显示为最短的整数值表示是可能的。
因此,您可以在字符串中嵌入{0:D}
来替换enum值。
GetValue返回一个枚举值对象。此对象属于一个类(Enum类(,该类将强制转换为带名称的字符串,或强制转换为带有值的整数。因此,当字符串格式需要一个字符串时,它就会得到。当它要求十进制(格式说明符D(时,枚举值会为它提供默认的基础值Int32,它很容易转换为decimal。
代码显式地将值打印两次
Console.WriteLine("Name: {0}, Value: {0:D}", enumData.GetValue(i));
第一个{0}
只打印原始值,第二个具有指定的格式(D
(
值是按照给定的格式打印出来的。请尝试删除{0:D},然后只使用{0}。与创建的列表一样,在中为列表指定类型
Array enumData = Enum.GetValues(e.GetType());