我可以把int转换成C#枚举类型吗?

4

我有一个枚举类型(底层类型为 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个回答

7
是的,您可以转换为基础类型的任何值。在这个意义上,枚举类型不是一种限制性类型。
使用枚举的优点是:
- 可读性 - 当您不显式转换时,正确性 - 通过反射等方式访问值的能力
我认为一个更多的类型也很有用,但它在C#中不存在。您可以在C#中构建基于类的“伪枚举”,允许使用受限制的值集(使用私有构造函数),但:
- 您无法使它们为非空 - 您无法对它们进行切换 - 无法将它们用作常量值(例如可选参数默认值) - 该值将始终是引用,这可能会影响内存使用情况(与具有基础类型为字节的枚举相比) - 在序列化面前保留受限制的值是有趣的
另一方面,这些类型可以表现出多态,并且比普通枚举具有更多的信息,这可能会很有用。

关于你的最后一点,枚举类型不能像其他任何东西一样具有多态性吗? - Justin Morgan
@Justin:不行,因为你不能让它们实现额外的接口、提供额外的方法、特殊化行为等。看看Java枚举的工作方式,你就会明白我的意思。 - Jon Skeet
啊,我明白了。我以为你只是在谈论函数重载或泛型类型参数之类的东西。我希望C#枚举可以被装饰上接口,或者至少以某种方式让你更好地控制它们的变形。 - Justin Morgan

6
只是补充一下Jon的回答:您始终可以使用


Enum.IsDefined(typeof(MyCode), value)

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


2
在许多方面,枚举类型在.NET语言中被实现为语法糖。引用一下:
“enum”关键字用于声明一个枚举类型,它是由一组名为枚举列表的命名常量组成的不同类型。
换句话说,枚举的值是像其他字段一样的,而不是整数值的选择。没有什么可以阻止您将无效值转换为枚举。您能够强制确保枚举的有效内容的最佳方法是使用Enum.IsDefined静态方法(尽管您可能想定义扩展方法)。
然而,枚举的目的并不是验证用户输入,因此它们不必像那样严格。枚举的目的是将名称与数字值绑定,并轻松显示可能的组合列表。不要忘记,它们松散的结构允许类似于Day.Saturday | Day.Friday这样的事情,或者更复杂的耦合。他们仍然非常有用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接