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在运行时抛出.
根据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.