【问题标题】:c# : Why is a cast needed from an Enum to an INT when used in a switch statement?, enums are intsc#:为什么在 switch 语句中使用时需要从枚举到 INT 的强制转换?,枚举是整数
【发布时间】:2010-11-19 12:15:36
【问题描述】:

谁能告诉我为什么我需要从我的枚举中转换为 Int

        switch (Convert.ToInt32(uxView.SelectedValue))
        {
            case (int)ViewBy.Client:

如果我删除演员表(int),它会失败并说我必须使用演员表。

这是我的枚举,枚举是整数......有人知道吗?

    public enum ViewBy
    {
        Client,
        Customer
    }

【问题讨论】:

    标签: c# enums casting switch-statement


    【解决方案1】:

    在 C# 中,enums 不仅仅是数字。相反,它们是与类型相关联的数字或在上下文中具有名称的数字。

    为避免在case 语句中进行强制转换,您可以在switch 中进行强制转换:

    switch((ViewBy)Convert.ToInt32(uxView.SelectedValue))
    

    然而,这有其自身的问题。例如,这段代码会将7写到控制台。

    enum ViewBy
    {
        ChuckNorris = 1,
        JamesBond
    }
    
    Console.WriteLine((ViewBy)7);
    

    【讨论】:

    • 它的问题是什么?!?!?告诉
    • @jordan.peoples 如果您仍然感兴趣,请查看我的更新。迟到总比不好,呵呵:)
    【解决方案2】:

    您应该使用Enum.Parse 将字符串值转换为枚举。

    ViewBy selected = (ViewBy) Enum.Parse(typeof(ViewBy), uxView.SelectedValue);        
    switch (selected)
    {
        case ViewBy.Client:
        // etc.
    }
    

    此外,枚举的基础类型不一定是 Int32。

    【讨论】:

      【解决方案3】:

      Enums NOT ints 在 .NET 类型系统中!
      框架借助离散整数值存储它们 - 这是另一回事...

      托马斯

      【讨论】:

        【解决方案4】:

        来自MSDN

        switch ( expression )
              case constant-expression : statement
           [default  : statement]
        

        每种情况下的常量表达式 标签转换为的类型 表达和比较 相等的表达式。控制 传递给其 case 的语句 常量表达式匹配值 表达方式。

        没有从 enum 到 int 的隐式转换,因此您的每个 case 都需要显式转换。但是请注意,最初打开正确类型的表达式比强制转换每种情况更有意义(请参阅Enum.Parse)。

        【讨论】:

          【解决方案5】:

          我想在这种情况下看起来有点蹩脚,有一个 int 和所有的转换。

          假设您向该方法传递了一个 int 而不是 enum,请记住:

          1. 您是否要做好足够的文档记录,以便将来随时可以修复或增强系统?
          2. 此枚举是否未在其他地方使用? (如何处理相同信息的模式是不让后辈犯错误或迷失自我的关键。)

          如果两者的答案都是否定的,那么为了你自己的理智,你应该考虑在不久的将来保留它。

          顺便说一句,转换为 int 并与另一个 int 进行比较比字符串更简单,例如。

          【讨论】:

            【解决方案6】:

            在回答“谁能告诉我为什么我需要从我的枚举中转换为 Int”这个问题时......

            您必须转换为整数,因为 Enums 值不是整数。枚举具有可以存储为整数类型的基础值(默认为 int)。

            您可以使用

            确定底层类型
            Enum.GetUnderlyingType( typeof(ViewBy) );
            

            您可以找到更多详细信息herehere

            【讨论】:

              【解决方案7】:

              为什么需要强制转换为 int? 如果 uxView.SelectedValue 是 ViewBy 枚举,那么只需 (ViewBy) uxView.SelectedValue 就足够了?

              【讨论】:

              • 这里听起来SelectedValuestring
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-12-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-04-30
              • 1970-01-01
              相关资源
              最近更新 更多