为什么我可以将无效值解析为.NET中的Enum?

时间:2010-02-03 09:52:55

标签: c# .net enums

为什么这甚至可能?这是一个错误吗?

using System;

public class InvalidEnumParse
{
    public enum Number
    {
        One,
        Two,
        Three,
        Four
    }

    public static void Main()
    {
        string input = "761";
        Number number = (Number)Enum.Parse(typeof(Number), input);
        Console.WriteLine(number); //outputs 761
    }
}

2 个答案:

答案 0 :(得分:14)

这就是枚举在.NET中运行的方式。枚举不是限制性的一组值,它实际上只是数字的一组名称(以及一起收集这些名称的类型) - 我同意这有时会很痛苦。

如果要测试枚举中是否确实定义了值,可以在解析后使用Enum.IsDefined。如果您希望以更加类型安全的方式执行此操作,您可能需要查看包含一组受限泛型方法的Unconstrained Melody项目。

答案 1 :(得分:3)

如果您的enum具有[Flags]属性,则可以使用任何值组合。例如:

[Flags]
enum Test
{
    A = 1, 
    B = 2,
    C = 4,
    D = 8
}

你可以这样做:

Test sample = (Test)7;
foreach (Test test in Enum.GetValues(typeof(Test)))
{
    Console.WriteLine("Sample does{0} contains {1}",
        (sample & test) == test ? "": " not", test);
}