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
}
4

3 回答 3

7

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

使用枚举的优点是:

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

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

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

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

于 2012-05-28T11:14:27.150 回答
6

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

Enum.IsDefined(typeof(MyCode), value)

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

于 2012-05-28T11:19:21.320 回答
2

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

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

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

然而,枚举的目的不是验证用户输入,所以它们不必那么严格。枚举的目的是将名称与数值联系起来,并轻松显示此类可能组合的列表。并且不要忘记它们的松散结构允许诸如Day.Saturday | Day.Friday或更复杂的联轴器之类的事情。它们仍然非常有用。

于 2012-05-28T11:20:36.197 回答