在C#中将'0'作为枚举的默认值有什么意义?如果我声明以不同数字开头的枚举:
enum Color
{
Blue = 1,
Green,
Red,
}
然后var color = default(Color)
- 将返回'0'。我希望看到最小值。如果枚举的每个成员对应于某个特定数字并且“0”不是有效值,则此行为可能会导致问题。
答案 0 :(得分:12)
所有值类型(包括枚举)的默认值都是按位0.结果表示即使未明确定义,0也始终是枚举的可能值。
以下是规范:Default values table
编辑:有关详细信息,请查看MSDN的枚举类型 - enum
枚举是一种特殊的类型,它的排序方式是从其他值类型(通常不可能)派生,但表现为其支持类型的值类型。枚举只能使用一些整数值作为支持类型。
注意:正如@archil所指出的,枚举值可以包含任何支持类型的值,而不管枚举本身枚举的常量列表如何。对于标有“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,否则您可能会遇到问题。您可以将此枚举值命名为Undefined
或Default
或类似名称。
正如我在对你的问题的评论中提到的那样,我的建议是不要使用你的枚举的值,除非你有充分的理由这样做。如果需要,请按照MSDN Programming Guide for Enumeration Types
进行操作答案 7 :(得分:0)
enum
是int
(默认情况下)。对于我们的源代码,枚举是人类可读的内容,但是当您的程序被编译时,没有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
怎么可能有一个默认值(如你所知),而不是其他情况?