C#枚举和铸造
如果在C#中声明枚举,默认类型将自动为int 那么,在使用枚举时,为什么在case语句或其他实例中必须显式重铸才能使用这些值呢?如果你必须明确说明情况,或者我只是做错了什么,那么拥有一个底层类型有什么意义呢C#枚举和铸造,c#,enums,C#,Enums,如果在C#中声明枚举,默认类型将自动为int 那么,在使用枚举时,为什么在case语句或其他实例中必须显式重铸才能使用这些值呢?如果你必须明确说明情况,或者我只是做错了什么,那么拥有一个底层类型有什么意义呢 private enum MyEnum { Value1, Value2, Value3 } switch (somevalue) {
private enum MyEnum
{
Value1,
Value2,
Value3
}
switch (somevalue)
{
case (int)MyEnum.Value1:
someothervar = "ss";
break;
case (int)MyEnum.Value2:
someothervar = "yy";
break;
case (int)MyEnum.Value3:
someothervar = "gg";
break;
}
如果
somevalue
的类型为MyEnum
,则不必强制转换为int
public enum Color
{
Red,
Blue,
Green
}
class Program
{
static void Main(string[] args)
{
Color color = Color.Red;
switch (color)
{
case Color.Red:
break;
case Color.Blue:
break;
case Color.Green:
break;
}
}
}
somevalue的类型是什么?如果类型为MyEnum,则不需要强制转换,并且应该可以正常工作 如果类型为int,那么是,为了正确切换/case,您必须强制转换到MyEnum。但是您可以通过强制转换值而不是每个case语句来简化这一过程。比如说
switch( (MyEnum)somevalue ) {
case MyEnum.Value1: ...
}
显然,somevalue是一个整数,而不是显式类型化为枚举。您应该记住,and不是隐式可互换的。但是,您可以轻松地使用cast运算符使代码简单且“更”安全:
private enum MyEnum { Value1, Value2, Value3 }
switch ((MyEnum)somevalue)
{
case MyEnum.Value1:
someothervar = "ss";
break;
case MyEnum.Value2:
someothervar = "yy";
break;
case MyEnum.Value3:
someothervar = "gg";
break;
default:
throw new NotSupportedException();
}
最终,您希望设计时不必将整数转换为枚举,但从磁盘或数据库读取时,通常情况下并非如此。正如其他人所说:
- 如果somevalue的类型为MyEnum,则 不应该投
- 如果您正在从数据库或 文本文件,您可能希望使用枚举的 Parse方法,以获取枚举值 从一根绳子上
- 如果你一定要比较 int,则在 切换到MyEnum,而不是 将每个MyEnum值强制转换为int