代码之家  ›  专栏  ›  技术社区  ›  Martin

c#:在switch语句中使用时,为什么需要从枚举转换为INT?,枚举是int

  •  16
  • Martin  · 技术社区  · 14 年前

    有人能告诉我为什么我需要从枚举中强制转换为Int吗

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

    如果我移除cast(int),它将失败并说我必须使用cast。

    这是我的枚举,枚举是int。。。。有人知道吗?

        public enum ViewBy
        {
            Client,
            Customer
        }
    
    7 回复  |  直到 14 年前
        1
  •  11
  •   Anton Gogolev    8 年前

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

    为了避免被抛弃 case 陈述,你可以在 switch :

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

    然而,这也有自己的问题。例如,这段代码将写出 7 到控制台。

    enum ViewBy
    {
        ChuckNorris = 1,
        JamesBond
    }
    
    Console.WriteLine((ViewBy)7);
    
        2
  •  4
  •   vgru    14 年前

    您应该使用 Enum.Parse .

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

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

        3
  •  2
  •   Thomas Weller    14 年前

    Enums 不是 ints 在.NET打字系统中!
    框架通过离散整数值存储它们-这是另一回事。。。

    托马斯

        4
  •  2
  •   icecrime    14 年前

    MSDN :

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

    每种情况下的常量表达式 标签转换为 表达与比较 平等表达 . 控制 传递给其案例的语句 常量表达式与值匹配 表达方式。

    没有从枚举到int的隐式转换,因此 case 需要显式转换。不过,请注意,最初打开正确类型的表达式比对每个大小写进行强制转换更有意义(请参见 Enum.Parse ).

        5
  •  0
  •   marcelo-ferraz    14 年前

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

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

    1. 您是否准备好文档,以便将来任何时候都可以修复或增强系统?
    2. 这个枚举在其他地方没有使用吗?(如何处理相同信息的模式是避免青少年犯错误或迷失自我的关键。)

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

    顺便说一句,对于每个例子来说,转换成int并将其与另一个int进行比较要比字符串简单得多。

        6
  •  0
  •   Matt    14 年前

    在回答“谁能告诉我为什么我需要从枚举中强制转换为Int”。。。。

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

    您可以使用

    Enum.GetUnderlyingType( typeof(ViewBy) );
    

    你可以找到更多的细节 here here

        7
  •  0
  •   Vitalogy    14 年前

    你为什么要用石膏来画? 如果uxView.SelectedValue是ViewBy枚举,那么简单的(ViewBy)uxView.SelectedValue就足够了,对吗?