代码之家  ›  专栏  ›  技术社区  ›  Ward Werbrouck

为什么要将无效值解析为.NET中的枚举?

  •  14
  • Ward Werbrouck  · 技术社区  · 14 年前

    为什么这是可能的?是虫子吗?

    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 回复  |  直到 14 年前
        1
  •  14
  •   Jon Skeet    14 年前

    这就是Enums在.NET中的工作方式。枚举不是一组限制性的值,它实际上只是一组用于数字的名称(以及将这些名称收集在一起的类型),我同意这有时是一种痛苦。

    如果要测试枚举中是否确实定义了值,可以使用 Enum.IsDefined 在分析之后。如果你想以一种更安全的方式来做这件事,你可以看看我的 Unconstrained Melody 包含一组受约束的泛型方法的项目。

        2
  •  3
  •   Rubens Farias    14 年前

    如果你有 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);
    }