我正在阅读一本书中的枚举,并给出了以下代码示例:
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。这是为什么?
答案 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());