代码之家  ›  专栏  ›  技术社区  ›  FrostyStraw

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

  •  0
  • FrostyStraw  · 技术社区  · 8 年前

    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

    名称:VicePresent,值:9

    姓名:经理,价值:10

    名称:承包商,价值:100

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

    4 回复  |  直到 8 年前
        1
  •  5
  •   rory.ap    8 年前

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

    G或G

    将枚举项显示为字符串值,如果 例子

    {0:G} 在字符串中替换枚举 名称 虽然没有提到, 等于 {0} ,这是您在示例中观察到的 Console.WriteLine("Name: {0},... .

    D或D

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

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

        2
  •  2
  •   user4843530 user4843530    8 年前

    对象 。此对象属于一个类(Enum类),该类将强制转换为具有其名称的字符串,或强制转换为带有其值的整数。因此,当字符串格式需要一个字符串时,就会得到它。当它要求一个十进制(格式说明符D)时,枚举值给它默认的基础值Int32,它很容易转换为decimal。

        3
  •  0
  •   Jamiec    8 年前

    代码显式打印该值两次

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

    第一个 {0} D )

        4
  •  0
  •   JDavila    8 年前

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

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