【问题标题】:C# enum array accepting a wrong value [duplicate]C#枚举数组接受错误的值[重复]
【发布时间】:2011-08-25 18:00:41
【问题描述】:

我正在研究一个 Web 服务方法,该方法将接收一个整数数组作为参数,然后在该方法内部,我将数组中的值转换为枚举值,并将它们存储在一个枚举列表中。但是,当传递不在枚举中的值时,它会毫无问题地添加到枚举列表中。没有InvalidCastException,什么都没有。我做了一个如下所示的测试项目:

static class Program
{
    static void Main(string[] args)
    {
        List<TestValues> values = new List<TestValues>() {
            TestValues.Value1,
            TestValues.Value2,
            (TestValues)15
        };

        foreach (var val in values)
            Console.WriteLine(val);

        Console.Read();
    }

    enum TestValues
    { 
        Value1 = 2,
        Value2 = 4,
        Value3 = 8
    }
}

当我运行它时,输出是:

Value1
Value2
15

对于我的 Web 服务,我将实施验证,因此这将永远不会发生。但是……这很奇怪!运行时不应该抛出InvalidCastExceptionArgumentOutOfRangeException 或类似的东西吗?由于我得到了一个枚举列表(而不是 int 值),因此我希望将值限制为枚举的值(这就是枚举的用途)。

我错过了什么吗?这是 .NET 错误、C# 错误还是我对枚举不了解的地方?

【问题讨论】:

标签: c# .net enums


【解决方案1】:

您可以为基础类型允许的enum 分配任何值。默认情况下,底层类型为int,因此您可以将任何int 值分配给enum

这样做的主要原因是,如果您有一个[Flags] 枚举,您希望能够分配复合值:

[Flags]
public enum MyFlags
{
    A = 1,
    B = 2
}

MyFlags flags = (MyFlags)3; // Equivalent to setting A and B

不过,您最好只使用枚举值来执行此操作:

MyFlags flags = MyFlags.A | MyFlags.B; // Sets flags to 3

当然,重要的是要注意[Flags] 属性不是启用此分配所必需的。所有enums 都具有此属性,设计使然。

正如许多人所指出的,您可以使用Enum.IsDefined() 来确定特定值对于给定的enum 是否有效。这应该有助于您的验证。

【讨论】:

  • 我完全忘记了[Flags],因为我很少使用它。对我来说,这似乎是一个明显的优势,但对于更常见的枚举使用来说有点奇怪。顺便说一句,cmets 和其他答案为该主题提供了很好的补充链接。
【解决方案2】:

是的,当您转换为枚举值时,不会检查定义的值。

您可以使用IsDefined 方法检查是否定义了特定值:

if (Enum.IsDefined(typeof(TestValues), value)) ...

【讨论】:

    【解决方案3】:

    您始终可以将任何 int 值转换为基于 int 的枚举。这是设计使然,因为如果必须检查所有合法值,强制转换会慢很多。

    【讨论】:

    • 我不认为速度是这里的决定因素。
    • @Henk - 请详细说明,除了标志之外还有其他因素吗?
    【解决方案4】:

    您应该阅读以下主题:

    Why does Enum.Parse create undefined entries?

    简而言之,这是有效的。如果要检查值是否已定义,请使用Enum.IsDefined

    【讨论】:

      【解决方案5】:

      要确定指定的int 是否在enum 中定义,您可以使用Enum.IsDefined

      Enum.IsDefined(typeof(TestValues), 15);
      

      【讨论】:

        猜你喜欢
        • 2021-05-30
        • 2016-03-05
        • 2020-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-22
        • 1970-01-01
        • 2012-08-31
        相关资源
        最近更新 更多