使用Enum.Parse()时出现意外结果
class Program { static void Main(string[] args) { String value = "Two"; Type enumType = typeof(Numbers); Numbers number = (Numbers)Enum.Parse(enumType, value); Console.WriteLine(Enum.Parse(enumType, value)); } public enum Numbers : int { One, Two, Three, Four, FirstValue = 1 } }
这是我在应用程序中使用的枚举的简化版本。 为什么某些枚举名称没有值的原因是因为我使用其名称作为参数执行Enum.Parse,而具有值的那些名称则从int解析。
如果您单步执行上面的代码并调查’number’变量,您会看到它实际上是’Two’,但控制台中的输出是’FirstValue’。 此时我看不清楚为什么,是吗?
好的,解决方案很简单 – 只需给无价值的枚举值。 但我仍然很好奇。
我怀疑FirstValue
和Two
的内部值都是1,所以系统不知道输出哪个字符串。
public enum Numbers : int { One, // defaults to 0 Two, // defaults to 1 Three, // defaults to 2 Four, // defaults to 3 FirstValue = 1 // forced to 1 }
每个枚举值都有一个唯一的整数值,但每个整数值都没有唯一的枚举值。
解析"two"
,它将在内部存储为整数1
。 然后,当您尝试将其转换回字符串时,根据用于查找该名称的技术,您可以获得"Two"
或"FirstValue"
。 正如您所说,解决方案是为每个枚举值指定一个定义的整数值。
这是你的问题的一个有趣的转折,尝试以下枚举…
public enum Numbers : int { One, Two, Four, FirstValue = 1 }
console.WriteLine(…)现在将打印“Two”!
Two
和FirstValue
表示相同的数字1
但看到的实际值取决于数字如何转换为其字符串表示forms,反之亦然。
Enum类使用reflection来获取数字的名称,然后将它们存储在数组中,但它会在它完成之前对整个事物进行排序。 然后,Enum.ToString()对已排序的值执行二进制搜索以获取字符串表示forms。 由于这样做的方式,您可能会得到不同的结果,具体取决于枚举中的元素数量!
现在至于VS中的“看到”值,我怀疑枚举的调试器可视化器使用了自己的算法来纠正(?)这个错误。