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

发布于 2024-08-19 18:25:46 字数 375 浏览 5 评论 0原文

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

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
    }
}

Why is this even possible? Is it a bug?

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
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

寂寞陪衬 2024-08-26 18:25:46

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

如果要测试枚举中是否真正定义了某个值,可以使用 Enum.IsDefined 解析后。如果您想以更类型安全的方式执行此操作,您可能需要查看我的 Unconstrained Melody 项目,其中包含一堆受约束的通用方法。

That's just the way enums work in .NET. The enum isn't a restrictive set of values, it's really just a set of names for numbers (and a type to collect those names together) - and I agree that's a pain sometimes.

If you want to test whether a value is really defined in the enum, you can use Enum.IsDefined after parsing it. If you want to do this in a more type-safe manner, you might want to look at my Unconstrained Melody project which contains a bunch of constrained generic methods.

若言繁花未落 2024-08-26 18:25:46

如果您有一个带有 [Flags] 属性的 enum,则可以具有任意值组合。例如:

[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);
}

If you have a enum with [Flags] attribute, you can have any value combination. For instance:

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

You could to do this:

Test sample = (Test)7;
foreach (Test test in Enum.GetValues(typeof(Test)))
{
    Console.WriteLine("Sample does{0} contains {1}",
        (sample & test) == test ? "": " not", test);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文