为什么默认枚举值为0而不是最小值?

时间:2012-05-24 17:26:03

标签: c# enums

在C#中将'0'作为枚举的默认值有什么意义?如果我声明以不同数字开头的枚举:

enum Color
{
   Blue = 1,
   Green,
   Red,
}

然后var color = default(Color) - 将返回'0'。我希望看到最小值。如果枚举的每个成员对应于某个特定数字并且“0”不是有效值,则此行为可能会导致问题。

8 个答案:

答案 0 :(得分:12)

所有值类型(包括枚举)的默认值都是按位0.结果表示即使未明确定义,0也始终是枚举的可能值。

以下是规范:Default values table

编辑:有关详细信息,请查看MSDN的枚举类型 - enum

枚举是一种特殊的类型,它的排序方式是从其他值类型(通常不可能)派生,但表现为其支持类型的值类型。枚举只能使用一些整数值作为支持类型。

注意:正如@a​​rchil所指出的,枚举值可以包含任何支持类型的值,而不管枚举本身枚举的常量列表如何。对于标有“FlagsAttribute”的枚举,通常需要此行为,但对于普通枚举,它可能不直观。

答案 1 :(得分:10)

我们只能推测为什么 .NET框架的一个方面是以某种方式设计的。对于最直接的解释,我想从the MSDN documentation强调这句话:

  

枚举是一组命名常量,其基础类型是   除Char之外的任何整数类型。如果没有明确的基础类型   声明,使用Int32。

请注意,.NET枚举本质上是整数类型的扩展。整数类型的默认值为0,因此枚举继承该行为是合理的(如果在您说明的情况下有些不方便)。

答案 2 :(得分:7)

枚举总是有可能存在不存在的价值。这就是Enum.IsDefined Method存在的原因。

  

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

答案 3 :(得分:3)

正如目前为止在多个答案中所述,任何固定大小的数据结构的“默认”值都是0.结构内存的大小设置为零,这被认为是“默认”。现在,如果要为枚举定义自己的“默认”值,则可以有多个选项。最简单的方法是编写自己的函数来为您提供“最小有效枚举”

private E GetDefaultEnum<E>()
{
    return (E)(Enum.GetValues(typeof(E)).Cast<E>().Min<E>());
}

用法:

enum Color
{
   Blue = 1,
   Green,
   Red,
}

Color defaultColor = GetDefaultEnum<Color>();
MessageBox.Show(defaultColor.ToString()); // "Blue"

您显然可以改变确定“默认”值的方式,但这种方式似乎最适合您的需求。

答案 4 :(得分:1)

为什么0是默认的枚举值?易于运行时实现。任何值类型的默认值都是按位0,并且可能是空引用由按位0表示。因此,要初始构造具有其默认值的对象,我们只需要知道它的大小;运行时不需要知道或处理有关对象结构的任何内容。类似地,预定义的值类型构造函数只能用零填充内存范围。

不管你喜欢与否,就是这样。我们需要做的回应是在设计枚举时,无论名称是合适的默认值,都给它值0.如果没有合适的默认值,那么接受这样的枚举作为参数的方法可能会检查它是否正确设置,例如

void ProcessColor(Color c) {
    if (c == 0)
        throw new ArgumentException("Color is not set", "c");
    //...
}

答案 5 :(得分:0)

概率具有较小的正整数可能值。

为什么正面

能够正确处理具有位移操作的枚举。

我自然而然地谈论默认值,可由开发人员更改。

答案 6 :(得分:0)

我不确定为什么但是......

以下是关于C#enum的文档:http://msdn.microsoft.com/en-us/library/sbbt4032.aspx

  

枚举器可以使用初始值设定项来覆盖默认值,如以下示例所示。

     

enum Days {Sat = 1,Sun,Mon,Tue,Wed,Thu,Fri};

     

在此枚举中,强制元素序列从1开始而不是0.但是,建议包括值为0的常量。有关详细信息,请see Enumeration Types (C# Programming Guide)

他们建议您始终包含占位符枚举值,该值对应于值0,否则您可能会遇到问题。您可以将此枚举值命名为UndefinedDefault或类似名称。

正如我在对你的问题的评论中提到的那样,我的建议是不要使用你的枚举的值,除非你有充分的理由这样做。如果需要,请按照MSDN Programming Guide for Enumeration Types

进行操作

答案 7 :(得分:0)

enumint(默认情况下)。对于我们的源代码,枚举是人类可读的内容,但是当您的程序被编译时,没有enum,只有int。 int的默认值为0.

此代码:

public enum test { One, Two, Three }

var x = test.One;
var y = 0;

在IL中成为这个:

IL_0001:  ldc.i4.0   
IL_0002:  stloc.0     
IL_0003:  ldc.i4.0    
IL_0004:  stloc.1 

那么,在某些情况下int怎么可能有一个默认值(如你所知),而不是其他情况?