我可以将 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
}

我可以将 int 转换为 C# 枚举类型吗?

是的,您可以强制转换基础类型的任何值。从这个意义上说,枚举类型不是限制性类型。

使用枚举的优点是:

  • 可读性
  • 显式转换时的正确性
  • 能够通过反射等访问值

我同意更多的类型也很有用,但它在 C# 中不存在。您可以在 C# 中构建自己的基于类的"伪枚举",这些枚举允许一组有限的值(使用私有构造函数),但是:

  • 不能使它们不可为空
  • 您无法打开它们
  • 不能将它们用于常量值(例如可选参数默认值)
  • 该值将始终是一个引用,这可能会影响内存使用情况(例如,与具有基础字节类型的枚举相比)
  • 面对序列化保留受限制的值很有趣

另一方面,此类类型可以多态地起作用,并且比普通枚举具有更多信息,这可能很有用。

只是为了补充乔恩的答案:你总是可以使用

Enum.IsDefined(typeof(MyCode), value)

检查枚举定义中是否存在提供的值。

在许多方面,枚举在 .NET 语言中作为语法糖实现。引用,

enum 关键字用于声明枚举,枚举是一种由一组称为枚举器列表的命名常量组成的不同类型。

换句话说,枚举的值与其他任何字段一样,不是值的整数选择。没有什么能阻止您将无效值转换为枚举。要强制确保枚举的有效内容,您最多可以使用 Enum.IsDefined 静态方法(尽管如果您喜欢,您可能需要定义扩展方法)。

尽管如此,枚举的目的不是验证用户输入,因此它们不必那么严格。枚举的目的是将名称绑定到数值,并轻松显示此类可能组合的列表。不要忘记,它们的松散结构允许Day.Saturday | Day.Friday或更复杂的联轴器。它们仍然非常有用。