C#枚举和铸造

时间:2009-03-11 02:58:22

标签: c# enums

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

那么为什么在case语句或其他实例中使用enum时你必须显式重新编译才能使用这些值?如果你必须明确表达或者我在这里做错了什么,那么有一个基础类型有什么意义呢?

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

4 个答案:

答案 0 :(得分:15)

somevalue的类型是什么?如果类型是MyEnum,则铸造是不必要的,并且应该没有错误。

如果类型是int然后是,则必须转换为MyEnum才能正确切换/大小写。但是你可以通过转换值而不是每个case语句来使这更简单一些。例如

switch( (MyEnum)somevalue )  {
  case MyEnum.Value1: ...
}

答案 1 :(得分:4)

显然,somevalue是一个整数,而不是明确键入你的枚举。您应该记住underlying value of an enum is just the "storage type"并且不能隐式地互换。但是,您可以轻松使用强制转换操作符使代码简单且“更”类型安全:

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();
}

最终你想要一个你不需要从整数转换为枚举的设计,但通常在从磁盘或DB读取时不是这种情况。

答案 2 :(得分:2)

如果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;
        }
    }
}

答案 3 :(得分:1)

正如其他人所说:

  • 如果某个值是MyEnum类型,那么你 不应该施展。
  • 如果您正在阅读数据库或 文本文件,您可能想要使用枚举 解析方法,获取枚举值 来自一个字符串。
  • 如果你绝对必须比较一个 int,投射更有效率 切换到MyEnum,而不是 将每个MyEnum值转换为int。
相关问题