【问题标题】:What is the default value for enum variable?枚举变量的默认值是多少?
【发布时间】:2011-06-25 10:57:33
【问题描述】:

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

【问题讨论】:

  • 对于需要默认枚举的用例的一个考虑因素是使用可为空的变量。当接收到一个空值时,它可以在代码的正确部分翻译成默认值,而这个默认值不必在其余代码中知道(只是传递一个空值)。

标签: c# .net enums


【解决方案1】:

它是枚举的任何成员代表值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(如上面的文档所引用,转换为给定的枚举类型)。

【讨论】:

  • 谢谢,用 char 而不是 int 定义的枚举呢?例如枚举状态 { Active = 'A', Inactive='I'}
  • @Fernando Torres:仍然为 0,除非您的枚举值之一对应于 '\0'default(char),这是极不可能的,因为 default(char) 是对应于字符代码 0 的 NUL 字符。
  • 我(错误地?)假设使用DefaultValue 属性——类似于System.ComponentModel.DefaultValue(MyEnum.Blah)——会修改default(MyEnum) 的行为,但它仍然产生0。有没有办法创建enum 在其默认值附近的抽象?
  • @Craig Silver:DefaultValue 属性适用于属性——枚举是一种类型,因此,DefaultValue 对整个枚举类型没有影响。我想你可以使用某种扩展方法来解决这个问题,但你最好只检查 0。
【解决方案2】:

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

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

否则,只需对订单进行粗心的重构,就会得到完全不同的默认值。

【讨论】:

  • 对不起,你错了。我假设相同,但如果您将Foo 放在Bar 之后,FooBar 的值都将为0,E.Foo == E.Bar 将返回true。这是如此愚蠢和违反直觉,但这是真的:(
【解决方案3】:

你可以用这个sn-p :-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
    }
}

【讨论】:

    猜你喜欢
    • 2011-10-14
    • 1970-01-01
    • 2015-10-22
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 2017-02-17
    • 1970-01-01
    相关资源
    最近更新 更多