对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。为什么会这样?

对Enum.GetValues()的返回值感到困惑

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());