为什么Enum.GetValues()在使用"var"时会返回名字?

Edw*_*uay 28 c# enums anonymous-types

有谁能解释一下?

替代文字http://www.deviantsart.com/upload/g4knqc.png

using System;

namespace TestEnum2342394834
{
    class Program
    {
        static void Main(string[] args)
        {
            //with "var"
            foreach (var value in Enum.GetValues(typeof(ReportStatus)))
            {
                Console.WriteLine(value);
            }

            //with "int"
            foreach (int value in Enum.GetValues(typeof(ReportStatus)))
            {
                Console.WriteLine(value);
            }

        }
    }

    public enum ReportStatus
    {
        Assigned = 1,
        Analyzed = 2,
        Written = 3,
        Reviewed = 4,
        Finished = 5
    }
}
Run Code Online (Sandbox Code Playgroud)

SLa*_*aks 42

Enum.GetValues被宣布为返回Array.
它返回的数组包含实际值作为ReportStatus值.

因此,var关键字变为object,value变量保持(加框)类型的枚举值.
Console.WriteLine调用解析为带有object和调用ToString()该对象的重载,对于枚举,它返回该名称.

迭代a时int,编译器会隐式地将值转换为int,并且value变量保存正常(和非盒装)int值.
因此,Console.WriteLine调用解析为带有int并打印它的重载.

如果你int改为DateTime(或任何其他类型),它仍然会编译,但它会InvalidCastException在运行时抛出.

  • 好的解释,+ 1.请注意,如果枚举的基础类型是另一种数字类型(例如uint或short),则第二个foreach也会失败. (3认同)

Dan*_*Tao 5

根据MSDN文档,它的重载Console.WriteLine需要对其参数进行object内部调用ToString.

当你这样做时foreach (var value in ...),你的value变量被输入为object(因为,因为SLaks指出,Enum.GetValues返回一个无类型Array),所以你Console.WriteLine正在调用object.ToString被覆盖的System.Enum.ToString.此方法返回枚举的名称.

当你这样做时foreach (int value in ...),你将枚举值转换为int值(而不是object); 所以Console.WriteLine打电话System.Int32.ToString.