枚举,没有值为'0'的字段

本文关键字:字段 枚举 | 更新日期: 2023-09-27 18:15:33

我编写了以下测试代码:

public enum Test
{
    One = 1,
    Two = 2
}
public class User
{
    public Test Flag { get; set; }
}

我这样使用:

var user = new User();
var value = typeof(Test).GetField(user.Flag.ToString());

值将是null,因为看起来User.Flag是用0初始化的。为什么呢?0不是我的枚举的有效值。它不应该用第一个有效值(1)初始化吗?

枚举,没有值为'0'的字段

枚举由整型支持,并且行为(大部分)与整型相似。

不幸的是,这意味着您可以将在基础类型上有效的任何值赋给enum—不需要检查。

在默认初始化的情况下,这将是底层类型的默认值,对于整型来说是0

你也可以这样做,它将编译并运行:

var value = (Test)43;

可以将枚举重新定义如下:

public enum Test
{
    None = 0,
    One = 1,
    Two = 2
}

Enum类有一些方便的方法来处理枚举-例如IsDefined,用于查找变量是否包含枚举的定义值。

使用底层类型的默认值进行初始化,即intdefault(int)0

Enum的底层类型默认为int类型,默认值显然是0(您可以指定自定义底层类型,但只能像enum CustomEnum : byte这样的原始数字)

1.10枚举,c#规范:

每个枚举类型都有一个相应的整型,称为底层类型enum类型的类型。没有显式声明的枚举类型基础类型的基础类型为int。枚举类型存储格式和可能值的范围由其基本类型。枚举类型可以接受的值的集合是不受枚举成员的限制。特别地,任何值枚举的基础类型可以强制转换为枚举类型,并且是该enum类型的唯一有效值。

GetField采用属性名的名称,并且您正在传递user.Flag

的enum值

你应该写

var value = (Test) typeof(Test).GetField("Flag").GetValue(user);