我可以将 int 转换为 C# 枚举类型吗?
本文关键字:枚举 类型 int 转换 我可以 | 更新日期: 2023-09-27 18:35:28
我有一个具有两个值的枚举(底层类型int
),以及一个采用该类型参数的方法。是否可以将任何 int 值强制转换为我的枚举类型并将其传递给方法?如果是这样,枚举的优势是什么?它不应该限制可用值的选择吗?
class Program
{
public void Greeting(MyCode code)
{
Console.WriteLine(code);
}
static void Main(string[] args)
{
var p = new Program();
var m = new MyCode();
m = (MyCode) 3;
p.Greeting(m);
}
}
public enum MyCode:int
{
Hello =1,
Hai
}
是的,您可以强制转换基础类型的任何值。从这个意义上说,枚举类型不是限制性类型。
使用枚举的优点是:
- 可读性
- 未显式转换时的正确性
- 能够通过反射等访问值
我同意更多的类型也很有用,但它在 C# 中不存在。您可以在 C# 中构建自己的基于类的"伪枚举",这些枚举允许一组有限的值(使用私有构造函数),但是:
- 不能使它们不可为空
- 您无法打开它们
- 不能将它们用于常量值(例如可选参数默认值)
- 该值将始终是一个引用,这可能会影响内存使用情况(例如,与具有基础字节类型的枚举相比)
- 面对序列化保留受限制的值很有趣
另一方面,此类类型可以多态地起作用,并且比普通枚举具有更多信息,这可能很有用。
只是为了补充乔恩的答案:你总是可以使用
Enum.IsDefined(typeof(MyCode), value)
检查枚举定义中是否存在提供的值。
在许多方面,枚举在 .NET 语言中作为语法糖实现。引用,
enum 关键字用于声明枚举,枚举是一种由一组称为枚举器列表的命名常量组成的不同类型。
换句话说,枚举的值与其他任何字段一样,不是值的整数选择。没有什么能阻止您将无效值转换为枚举。要强制确保枚举的有效内容,您最多可以使用 Enum.IsDefined
静态方法(尽管如果您喜欢,您可能需要定义扩展方法)。
尽管如此,枚举的目的不是验证用户输入,因此它们不必那么严格。枚举的目的是将名称绑定到数值,并轻松显示此类可能组合的列表。不要忘记,它们的松散结构允许Day.Saturday | Day.Friday
或更复杂的联轴器。它们仍然非常有用。