我有一个带有两个值的枚举(基础类型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
}
答案 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
或更复杂的耦合。它们仍然非常有用。