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

时间:2012-05-28 11:07:24

标签: c# .net enums

我有一个带有两个值的枚举(基础类型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
}

3 个答案:

答案 0 :(得分:7)

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

使用枚举的优点是:

  • 可读性
  • 明确施展
  • 时的正确性
  • 能够通过反思等方式访问值

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

  • 你不能让它们成为不可空的
  • 您无法启用它们
  • 您不能将它们用于常量值(例如可选参数默认值)
  • 该值将始终为引用,这可能会影响内存使用量(例如,与具有基础类型字节的枚举相比)
  • 面对序列化时保留限制值很有意思

另一方面,这些类型可以多态地行动,并且比普通枚举更多信息,这可能是有用的。

答案 1 :(得分:6)

只是为了补充Jon的答案:你可以随时使用

Enum.IsDefined(typeof(MyCode), value)

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

答案 2 :(得分:2)

在许多方面,Enums在.NET语言中实现为syntactic sugar。引用,

  

enum关键字用于声明枚举,这是一个由一组名为常量的枚举器列表组成的独特类型。

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

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