none
多个枚举标记为同一个值,输出枚举的时候应该如何指定? RRS feed

  • 问题

  •     class Program
        {
            static void Main(string[] args)
            {
                var type1 = (ddd)Enum.Parse(typeof(ddd), "RESISTOR");
                var type2 = (ddd)Enum.Parse(typeof(ddd), "CAPACITOR");
                var type3 = (ddd)Enum.Parse(typeof(ddd), "CONNECTOR");
    
                Console.WriteLine(type1);
                Console.WriteLine(type2);
                Console.WriteLine(type3);
            }
    
    
        }
    
        [Flags]
        enum ddd
        {
            CAPACITOR = 1,
            Capacitor = 1,
            capacitor = 1,
            CAPACITORS = 1,
            Capacitors = 1,
            capacitors = 1,
            CONNECTOR = 2,
            Connector = 2,
            connector = 2,
            CONNECTORS = 2,
            Connectors = 2,
            connectors = 2,
        }
    

    例如上面代码我编译后实际输出是:

    resistors
    capacitors
    connectors

    如果不加Flags,那么输出就是:

    Resistor
    CAPACITORS
    connector

    那么这是为什么?C#如何去判断应该输出哪一个?如何指定输出项?

    2016年8月16日 0:47

答案

全部回复

  • Hi Neo Xiao,

    首先我们要了解[flag] 标志是干嘛用的. 从MSDN文档中我们知道它是为了设置bitwise而产生的.

    正常情况我们使用enum是如下:

    [Flags] public enum AttackType {
        None   = 0,
        Melee  = 1,
        Fire   = 2,
        Ice    = 4,
        Poison = 8
    }
    // ...
    public AttackType attackType = AttackType.Melee | AttackType.Fire;

    每一个枚举代表一个数值. 他们是不能相互组合成一个新的类型出来.

    如果你使用flag标志,如下面:

    // Consecutive
    public enum AttackType {
        // Decimal     // Binary
        None   = 0,    // 000000
        Melee  = 1,    // 000001
        Fire   = 2,    // 000010
        Ice    = 3,    // 000011
        Poison = 4     // 000100
    }

    他们占据一个字节中不同的位,而不是每个都占据一字节. 而且他们还可以相互组合成新的类型,如下:

    attackType = AttackType.Melee | AttackType.Fire;
    // OR
    attackType = AttackType.Melee;
    attackType |= AttackType.Fire;

    所以它输出什么类型,是和bitwise相关的。详细的解释可以看这个链接:http://www.alanzucconi.com/2015/07/26/enum-flags-and-bitwise-operators/

    Best Regards,

    Hart


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place. Click HERE to participate the survey.

    2016年8月16日 7:16
    版主
  • 我想你误解我的问题了,我的问题是在我的例子里:

    为什么我输入的是CONNECTOR,通过转换后反过来输出的的connectors,或者是connector,而不是我当时所输入的CONNECTOR。

    如果通过第一次转换,type3的本质已经是int类型的2,那么我如果选择性地输出这个enum中值为2的名称?

    2016年8月20日 13:58
  • Hi Neo Xiao,

    Thank you for feedback.

    枚举里面应该是不可以,不同的变量定义同一个值得。

    我觉得编译器都不知道输出什么了。

    Best Regards,

    Hart


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place. Click HERE to participate the survey.

    2016年8月22日 8:23
    版主
  • .Net已开源,详情可自行查看源码。

    • 已建议为答案 [-] 2016年8月22日 10:43
    • 已标记为答案 Neo Xiao 2016年9月7日 5:29
    • 已编辑 [-] 2018年1月11日 12:25
    2016年8月22日 10:43
  • 谢谢建议
    2016年9月7日 5:29