使用Enum.Parse()时出现意外结果

时间:2009-02-09 22:17:27

标签: c# enums parsing

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'。在这一点上,我不明白为什么,是吗?

好的,解决方案很简单 - 只需给无价值的枚举值。但我仍然很好奇。

2 个答案:

答案 0 :(得分:10)

我怀疑FirstValueTwo的内部值都是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"。正如你所说,解决方案是给每个枚举值一个定义的整数值。

答案 1 :(得分:2)

这是您的问题的一个有趣的转折,尝试以下枚举......

public enum Numbers : int
{
    One,
    Two,
    Four,
    FirstValue = 1
}

console.WriteLine(...)现在将打印“Two”!

TwoFirstValue都代表相同的数字1,但看到的实际值取决于数字如何转换为字符串表示形式,反之亦然。

Enum类使用反射来获取数字的名称,然后将它们存储在数组中,但它会在完成之前对整个数据进行排序。然后,Enum.ToString()对已排序的值执行二进制搜索以获取字符串表示形式。由于这样做的方式,您可能会得到不同的结果,具体取决于枚举中的元素数量!

现在关于VS中的“看到”值,我怀疑枚举的调试器可视化器使用了自己的算法来纠正(?)这个错误。