C#枚举数组接受错误的值

Rap*_*ael 19 .net c# enums

我正在研究一个Web服务方法,它将接收一个int数组作为参数,然后,在方法内部,我将数组中的值转换为枚举值,并将它们存储在枚举列表中.但是,当传递不在枚举中的值时,它将被添加到枚举列表中而没有任何问题.不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
    }
}
Run Code Online (Sandbox Code Playgroud)

当我运行它时,输出是:

Value1
Value2
15
Run Code Online (Sandbox Code Playgroud)

对于我的Web服务,我将实现验证,因此根本不会有任何问题.但是......这很奇怪!运行时不应该抛出一个InvalidCastExceptionArgumentOutOfRangeException类似的东西吗?由于我得到了一个枚举列表(而不是int值),我希望将值限制为枚举值(这就是枚举的用途).

我错过了什么吗?这是一个.NET错误,一个C#错误还是有一些我不知道的枚举?

dle*_*lev 20

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

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

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

MyFlags flags = (MyFlags)3; // Equivalent to setting A and B
Run Code Online (Sandbox Code Playgroud)

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

MyFlags flags = MyFlags.A | MyFlags.B; // Sets flags to 3
Run Code Online (Sandbox Code Playgroud)

当然,重要的是要注意,[Flags]启用此分配不需要该属性.所有人enum都有这个属性,按设计.

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


Guf*_*ffa 5

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

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

if (Enum.IsDefined(typeof(TestValues), value)) ...
Run Code Online (Sandbox Code Playgroud)