关于Enum.GetValues()返回值的困惑

时间:2016-08-05 14:31:32

标签: c# enums enumeration

我正在阅读一本书中的枚举,并给出了以下代码示例:

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

     

姓名:副总统,价值:9

     

姓名:经理,价值:10

     

名称:承包商,价值:100

但是它如何获得每个枚举元素的名称和值?根据Microsoft文档,Array enumData = Enum.GetValues(e.GetType());应该只返回“指定枚举中常量值的数组”。我假设通过常数,它指的是“经理”,“咕噜”,“承包商”,“副总统”,而不是10,1,100和9.那么为什么它返回每一对而不仅仅是名称员工类型?此外,以下代码Console.WriteLine(enumData.GetValue(1));的输出只返回一个值,即“VicePresident”,并且不会像在forloop中那样返回数字9。这是为什么?

4 个答案:

答案 0 :(得分:5)

Console.WriteLine(String, Object)使用the "Composite Formatting" features of .NET,当您为其提供枚举值时,它会应用the "Enumeration Format Strings"

  

G或g

     

将枚举条目显示为字符串值if   可能,否则显示当前的整数值   实例。

因此,您可以在字符串中嵌入{0:G}来替换枚举名称。虽然没有提及,但{0:G}相当于{0},这是您在Console.WriteLine("Name: {0},...示例中观察到的内容。

  

D或d

     

将枚举条目显示为最短的整数值   表示可能。

因此,您可以在字符串中嵌入{0:D}来替换枚举

答案 1 :(得分:2)

GetValue返回枚举值 object 。此对象是一个类(Enum类),它将转换为具有其名称的字符串,或者转换为具有其值的整数。因此,当字符串格式化需要一个字符串时,它就会得到它。当它要求一个十进制(格式说明符D)时,枚举值赋予它默认的基础值Int32,它很容易转换为十进制。

答案 2 :(得分:0)

代码显式地打印了两次值

Console.WriteLine("Name: {0}, Value: {0:D}", enumData.GetValue(i));

第一个{0}只打印原始值,第二个指定格式(D

答案 3 :(得分:0)

通过给定的格式打印出值。尝试删除{0:D},仅使用{0}。与在创建的列表中一样,为列表指定类型:

        Array enumData = Enum.GetValues(e.GetType());