C#枚举和铸造

C#枚举和铸造,c#,enums,C#,Enums,如果在C#中声明枚举,默认类型将自动为int 那么,在使用枚举时,为什么在case语句或其他实例中必须显式重铸才能使用这些值呢?如果你必须明确说明情况,或者我只是做错了什么,那么拥有一个底层类型有什么意义呢 private enum MyEnum { Value1, Value2, Value3 } switch (somevalue) {

如果在C#中声明枚举,默认类型将自动为int

那么,在使用枚举时,为什么在case语句或其他实例中必须显式重铸才能使用这些值呢?如果你必须明确说明情况,或者我只是做错了什么,那么拥有一个底层类型有什么意义呢

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

真的-1?我可以得到一个理由吗?我没有否决它,但对我来说,问题是假设对枚举的转换将成功。如果该值不是有效的枚举值怎么办?“稍后再看我的答案。”沃尔登,这与问题无关。问题是“为什么这个不能编译”。将int转换为从int派生的枚举将成功,无论值是什么。您定义了一个枚举,传入的参数(somevalue)是一个int。我觉得很奇怪。。。