枚举,没有值为'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
)初始化吗?
枚举由整型支持,并且行为(大部分)与整型相似。
不幸的是,这意味着您可以将在基础类型上有效的任何值赋给enum—不需要检查。
在默认初始化的情况下,这将是底层类型的默认值,对于整型来说是0
。
你也可以这样做,它将编译并运行:
var value = (Test)43;
可以将枚举重新定义如下:
public enum Test
{
None = 0,
One = 1,
Two = 2
}
Enum
类有一些方便的方法来处理枚举-例如IsDefined
,用于查找变量是否包含枚举的定义值。
使用底层类型的默认值进行初始化,即int
和default(int)
为0
。
Enum的底层类型默认为int
类型,默认值显然是0
(您可以指定自定义底层类型,但只能像enum CustomEnum : byte
这样的原始数字)
1.10枚举,c#规范:
每个枚举类型都有一个相应的整型,称为底层类型enum类型的类型。没有显式声明的枚举类型基础类型的基础类型为int。枚举类型存储格式和可能值的范围由其基本类型。枚举类型可以接受的值的集合是不受枚举成员的限制。特别地,任何值枚举的基础类型可以强制转换为枚举类型,并且是该enum类型的唯一有效值。
GetField
采用属性名的名称,并且您正在传递user.Flag
你应该写
var value = (Test) typeof(Test).GetField("Flag").GetValue(user);