当我们联系不存在的枚举时,为什么没有得到异常?

时间:2018-11-23 11:39:31

标签: c# .net enums

对我来说很有趣,为什么这段代码不会给出异常,而12356将输出到控制台? 这个行为枚举是什么意思?

enum Dummy { D1 = 123, D2 = 1234, D3 }
class Program
{
     static void Main(string[] args)
     {
          Dummy d = (Dummy)12356;
          Console.WriteLine((int)d);
          Console.ReadKey();
     }
}

这是错误还是功能?

2 个答案:

答案 0 :(得分:1)

  

这是错误还是功能?

一项功能,尽管当代码无法按预期工作时,它可能会带您进入奇怪的情况。

例如,您可以合并枚举值,例如:

enum Dummy { D1 = 1, D2 = 2, D3 = 4 }

Dummy v = Dummy.D1 | Dummy.D2;

此处的后备值为3。

您可以检查以下任一值:

bool isD1 = (v & Dummy.D1) == Dummy.D1;

您可以像这样检查枚举的单值有效性:

Dummy v = Dummy.D1;
bool isValid = Enum.IsDefined(typeof(Dummy), v);

答案 1 :(得分:0)

这是设计使然,但不鼓励使用,如the documentation中所述:

  

可以将任意整数值分配给MeetingDay。对于   例如,以下代码行不会产生错误:MeetingDay =   (天)42.但是,您不应这样做,因为隐式   期望枚举变量将仅包含值之一   由枚举定义。为一个变量赋一个任意值   枚举类型会带来很高的错误风险。

您始终可以使用IsDefined检查是否为枚举类型定义了给定值:

Console.WriteLine(Enum.IsDefined(typeof(Dummy), 123)); //True
Console.WriteLine(Enum.IsDefined(typeof(Dummy), 123456)); //False