C# 枚举类型和类型转换

7
如果在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)是一个整数。对我来说看起来很奇怪... - Patrick Peters
4个回答

15

somevalue的类型是什么?如果类型是MyEnum,则无需进行转换,并且应该可以正常工作而不会出错。

如果类型是int,那么您将不得不将其强制转换为MyEnum才能正确地进行switch / case操作。但是,您可以通过转换值而不是每个case语句来简化此过程。例如

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

真的是-1吗?我能得到一个理由吗? - JaredPar
1
我没有给它点踩,但对我来说问题在于假设将枚举转换会成功。如果该值不是有效的枚举值怎么办?请看我的后续回答。 - Walden Leverich
2
@Walden,这与问题无关。问题是“为什么无法编译”。将int强制转换为从int派生的枚举将成功,无论值如何。 - JaredPar

4

显然,somevalue是一个整数,而不是明确声明为枚举类型。你应该记住枚举的底层值只是“存储类型”,并不是隐式可互换的。但是,你可以使用强制转换运算符使你的代码更简单和“更”类型安全:

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

最终,您希望拥有一种设计,不需要从整数转换为枚举类型,但在从磁盘或数据库读取时,通常情况下并非如此。

2
如果somevalueMyEnum类型,你不需要将其转换为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;
        }
    }
}

1

正如其他人所说:

  • 如果somevalue是MyEnum类型, 则不需要强制转换。
  • 如果您正在从数据库或文本文件中读取数据, 可能希望使用枚举的Parse方法从字符串中获取枚举值。
  • 如果您绝对必须比较一个整数, 那么在switch语句中将其转换为MyEnum更有效率, 而不是将每个MyEnum值都转换为整数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接