我正在研究一个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服务,我将实现验证,因此根本不会有任何问题.但是......这很奇怪!运行时不应该抛出一个InvalidCastException 或ArgumentOutOfRangeException类似的东西吗?由于我得到了一个枚举列表(而不是int值),我希望将值限制为枚举值(这就是枚举的用途).
我错过了什么吗?这是一个.NET错误,一个C#错误还是有一些我不知道的枚举?
dle*_*lev 20
您可以将任何值分配给enum基础类型允许的值.默认情况下,基础类型是int,因此您可以为其分配任何int值enum.
这样做的主要原因是,如果您有[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.这应该有助于您的验证.
是的,转换为枚举值时,不会检查定义的值.
您可以使用该IsDefined方法检查是否定义了特定值:
if (Enum.IsDefined(typeof(TestValues), value)) ...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1739 次 |
| 最近记录: |