enum变量的默认值是什么

use*_*949 226 .net c# enums

一个枚举变量,任何人都知道它是否总是默认为第一个元素?

Bol*_*ock 361

它是枚举的任何成员代表值0.具体来说,从文档:

an的默认值enum E是表达式生成的值(E)0.

例如,请使用以下枚举:

enum E
{
    Foo, Bar, Baz, Quux
}
Run Code Online (Sandbox Code Playgroud)

在不覆盖默认值的情况下,打印default(E)返回,Foo因为它是第一个出现的元素.

但是,并不总是0枚举由第一个成员表示的情况.例如,如果您这样做:

enum F
{
    // Give each element a custom value
    Foo = 1, Bar = 2, Baz = 3, Quux = 0
}
Run Code Online (Sandbox Code Playgroud)

打印default(F)会给你Quux,而不是Foo.

如果枚举中没有元素G对应于0:

enum G
{
    Foo = 1, Bar = 2, Baz = 3, Quux = 4
}
Run Code Online (Sandbox Code Playgroud)

default(G)字面上返回0,虽然它的类型保持为G(如上面的文档所引用的,给定枚举类型的强制转换).

  • @Fernando Torres:仍为0,除非你的一个枚举值对应于''\ 0'或`default(char)`,这是极不可能的,因为`default(char)`是对应于char代码0的NUL字符. (3认同)
  • 谢谢,那么用 char 而不是 int 定义的枚举又如何呢?例如 enum Status { Active = 'A', Inactive='I'} (2认同)
  • @Craig Silver:DefaultValue属性适用于属性 - 枚举是一种类型,因此,DefaultValue对整个枚举类型没有影响.我想你可以通过各种扩展方法解决这个问题,但你最好只检查0. (2认同)

Pie*_*rez 11

你可以使用这个片段:-D

using System;
using System.Reflection;

public static class EnumUtils
{
    public static T GetDefaultValue<T>()
        where T : struct, Enum
    {
        return (T)GetDefaultValue(typeof(T));
    }

    public static object GetDefaultValue(Type enumType)
    {
        var attribute = enumType.GetCustomAttribute<DefaultValueAttribute>(inherit: false);
        if (attribute != null)
            return attribute.Value;

        var innerType = enumType.GetEnumUnderlyingType();
        var zero = Activator.CreateInstance(innerType);
        if (enumType.IsEnumDefined(zero))
            return zero;

        var values = enumType.GetEnumValues();
        return values.GetValue(0);
    }
}
Run Code Online (Sandbox Code Playgroud)

例子:

using System;

public enum Enum1
{
    Foo,
    Bar,
    Baz,
    Quux
}
public enum Enum2
{
    Foo  = 1,
    Bar  = 2,
    Baz  = 3,
    Quux = 0
}
public enum Enum3
{
    Foo  = 1,
    Bar  = 2,
    Baz  = 3,
    Quux = 4
}
[DefaultValue(Enum4.Bar)]
public enum Enum4
{
    Foo  = 1,
    Bar  = 2,
    Baz  = 3,
    Quux = 4
}

public static class Program 
{
    public static void Main() 
    {
        var defaultValue1 = EnumUtils.GetDefaultValue<Enum1>();
        Console.WriteLine(defaultValue1); // Foo

        var defaultValue2 = EnumUtils.GetDefaultValue<Enum2>();
        Console.WriteLine(defaultValue2); // Quux

        var defaultValue3 = EnumUtils.GetDefaultValue<Enum3>();
        Console.WriteLine(defaultValue3); // Foo

        var defaultValue4 = EnumUtils.GetDefaultValue<Enum4>();
        Console.WriteLine(defaultValue4); // Bar
    }
}
Run Code Online (Sandbox Code Playgroud)


use*_*431 10

我认为依赖枚举中值的顺序并假设第一个始终是默认值是非常危险的.如果您担心保护默认值,这将是一个很好的做法.

enum E
{
    Foo = 0, Bar, Baz, Quux
}
Run Code Online (Sandbox Code Playgroud)

否则,所需要的只是一个粗略的订单重构,你有一个完全不同的默认值.

  • 抱歉你错了。我也假设了同样的情况,但是如果你把 `Foo` 放在 `Bar` 之后,`Foo` 和 `Bar` 的值都将为 0,并且 `E.Foo == E.Bar` 将返回 `true`。这太愚蠢和违反直觉了,但这是事实:( (8认同)