如果作为枚举键入的变量如何获取超出其元素范围的值?

时间:2011-04-18 14:31:14

标签: c# .net enums default-value

有人可以向我解释这个枚举的成员如何获得0的值吗?

public enum EnumLogicalOperator
{
    And = 1,
    Or = 2
}

enter image description here


enter image description here


enter image description here

8 个答案:

答案 0 :(得分:5)

每当您使用default(EnumLogicalOperator)new EnumLogicalOperator()时,您都会获得零值。换句话说,枚举类型成员的默认值始终为0.所有枚举的值都为0,直到您将其设置为其他值。

答案 1 :(得分:4)

枚举类型的实例可以从其基础类型的任何合法值创建,即使枚举的“命名”成员没有与该基础值相关联。特别是,通常会看到值0,因为:

  1. 这是枚举类型的默认值。
  2. 为方便起见,C#允许您隐式将文字0转换为任何枚举类型。

答案 2 :(得分:4)

枚举的默认值为0;我相信standard recommendation是你总是在你的枚举中包含分配给0的东西以解释这个问题(“未知”或“无”在我的经验中都很有效。)

答案 3 :(得分:4)

本页提及:http://msdn.microsoft.com/en-us/library/sbbt4032%28v=vs.80%29.aspx

  

枚举E的默认值是表达式(E)0

生成的值

所以基本上,默认值总是是整数值0.所以我猜你在这里得到的是LogicalOperatorWithPreviousRule从未被赋值。

答案 4 :(得分:3)

整数变量的默认值为0.并且因为每个枚举元素的默认基础类型是int,它表示一个整数,所以变量的默认值将是0

documentation明确指出:

  

枚举E的默认值是表达式(E)0生成的值。


获取不同默认值的唯一方法是在声明变量时显式初始化它:

EnumLogicalOperator x = EnumLogicalOperator.Or;

这就是为什么it's generally recommended 0对应于枚举中的有效元素,因为这将是该类型的所有变量的默认值。


此外,可以将任何任意整数值分配给作为枚举输入的变量。 documentation警告:

  

可以将任意整数值分配给meetingDay。例如,这行代码不会产生错误:meetingDay =(Days)42。但是,您不应该这样做,因为隐含的期望是枚举变量只保留枚举定义的值之一。将任意值分配给枚举类型的变量是为了引入高风险的错误。

C#语言规范(特别是关于枚举的1.10节)更清楚了:

  

枚举类型可以采用的值集不受其枚举成员的限制。特别是,枚举的基础类型的任何值都可以强制转换为枚举类型,并且是该枚举类型的唯一有效值。

这就是为什么公共框架方法总是验证指定的值是否在该枚举的有效值范围内是非常重要的。您不能依赖类型检查系统来确保这一点。框架设计指南建议:

  

进行参数验证。不要假设枚举参数将在定义的范围内。将任何整数值强制转换为枚举是合法的,即使该值未在枚举中定义。

答案 5 :(得分:3)

来自C# Language Specification 1.10,枚举部分):

  

枚举类型的值集   可以承担的不受其枚举的限制   成员。特别是,任何价值   枚举的基础类型可以是   转换为枚举类型,是一个   该枚举的唯一有效值   类型。

此外, 4.1.2节,默认构造函数指定枚举默认为0

下载该文档,其中包含许多有趣的信息: - )

答案 6 :(得分:3)

枚举可以根据其基础类型(在您的情况下为Int32)具有任何值。

EnumLogicalOperator op = (EnumLogicalOperator) 0;
EnumLogicalOperator op = (EnumLogicalOperator) 100;
EnumLogicalOperator op = (EnumLogicalOperator) 900000;
EnumLogicalOperator op = (EnumLogicalOperator) -1;

private EnumLogicalOperator _op; // As a class member, will default to 0

确认输入并处理错误情况时,请务必使用Enum.IsDefined。通常一个好主意是将0作为一个枚举值的值。

答案 7 :(得分:0)

我建议你包含一个值为0的成员“Undefined”或将你的“And”或“Or”作为0值。