繁体   English   中英

C# 枚举和铸造

[英]C# Enums and casting

如果在 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 那么是的,您必须转换为 MyEnum 才能正确切换 / 大小写。 但是您可以通过强制转换值而不是每个 case 语句来简化这一点。 例如

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

显然 somevalue 是 integer 而不是明确键入为您的枚举。 您应该记住,枚举的基础值只是“存储类型” ,并且不能隐式互换。 但是,您可以轻松地使用 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();
}

最终,您会想要一个不必从 integer 转换为枚举的设计,但在从磁盘或数据库读取时,通常情况并非如此。

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

正如其他人所说:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM