C# 关于Enum.GetValues()返回值的混淆
我在一本书中阅读了有关枚举的内容,并给出了以下代码示例:C# 关于Enum.GetValues()返回值的混淆,c#,enums,enumeration,C#,Enums,Enumeration,我在一本书中阅读了有关枚举的内容,并给出了以下代码示例: namespace FunWithEnums { enum EmpType : byte { Manager = 10, Grunt = 1, Contractor = 100, VicePresident = 9 } class Program { static void Main(string[] args)
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文档,数组enumData=Enum.GetValuese.GetType;应该只返回指定枚举中常量值的数组。我假设通过常量,它指的是经理、格鲁特、承包商、副总裁,而不是10、1100和9。那么,为什么要返回每一对,而不仅仅是员工类型的名称呢?此外,以下代码Console.writelinenumdata.GetValue1的输出;只返回一个值,即VicePresident,它不会像forloop中那样返回数字9。这是为什么?使用,当您为其提供枚举值时,它适用于:
G或G
如果需要,将枚举项显示为字符串值
可能,否则显示当前值的整数值
例如
因此,您可以在字符串中嵌入{0:G}以替换枚举名。尽管没有提到,{0:G}相当于{0},这是您在示例中观察到的Console.WriteLineName:{0}
D还是D
将枚举项显示为最短路径中的整数值
代表性是可能的
因此,可以在字符串中嵌入{0:D}以替换枚举值 代码显式打印值两次
Console.WriteLine("Name: {0}, Value: {0:D}", enumData.GetValue(i));
第一个{0}只打印原始值,第二个具有指定格式的DGetValue返回枚举值对象。此对象属于类Enum类,该类将使用其名称强制转换为字符串,或使用其值强制转换为整数。因此,当字符串格式化需要一个字符串时,它就会得到它。当它要求使用十进制格式说明符D时,枚举值将为其提供默认的基础值Int32,该值很容易转换为十进制。这些值将按给定的格式打印出来。尝试删除{0:D},只使用{0}。与在创建的列表中一样,在以下位置为列表指定类型:
Array enumData = Enum.GetValues(e.GetType());
我想:这就是你的问题所在。你们编造了一个关于常数值的含义的故事。程序的输出表明故事显然是错误的。因此,从输出中学习,尝试构建一个新的故事,它与你面前的事实相一致。因此,当它指的是常量时,它指的是名称-值对,而不仅仅是名称?不是值对,一个具有方法、成员变量和父类的对象,以及哪个Console.WriteLine将在需要字符串时查询其字符串表示形式,以及在需要字符串时查询其数字表示形式。@FrostyStraw Right,.NET枚举常量是包含stuff的对象。它不像C中的枚举。因此GetValue返回一个对象,因为数组enumData包含对象,这要归功于用于填充数组的enum.GetValues方法?是的,GetValues为您提供一个值数组,每个值都是enum类。在循环中,您可以执行类似于e.GetValues Console.WriteLineName:{0}中的foreach var值的操作,值:{0:D},值;看看这里的例子:是的,关于表达式的正确语法,您是完全正确的。我的错误。