enum变量的默认值是什么

时间:2011-02-11 09:57:26

标签: c# .net enums

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

3 个答案:

答案 0 :(得分:341)

枚举的任何成员都代表值0。具体来说,来自documentation

  

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

例如,请使用以下枚举:

enum E
{
    Foo, Bar, Baz, Quux
}

如果不覆盖默认值,打印default(E)会返回Foo,因为它是第一个出现的元素。

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

enum F
{
    // Give each element a custom value
    Foo = 1, Bar = 2, Baz = 3, Quux = 0
}

打印default(F)将为您Quux,而不是Foo

如果枚举G中的所有元素都不对应0

enum G
{
    Foo = 1, Bar = 2, Baz = 3, Quux = 4
}

default(G)按字面意思0返回,但其类型仍为G(由上述文档引用,为给定枚举类型的强制转换)。

答案 1 :(得分:9)

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

enum E
{
    Foo = 0, Bar, Baz, Quux
}

否则,所需要的只是订单的粗心重构,而且您的默认设置完全不同。

答案 2 :(得分:0)

您可以使用此代码段:-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);
    }
}

示例:

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
    }
}
相关问题