none
【百思不得其解】Enum枚举类型的转换! RRS feed

  • 问题

  • [Flags] enum Colors { None=0, Red = 1, Green = 2, Blue = 4 }; publicclass Example { publicstaticvoid Main() { string[] colorStrings = { "0", "2", "8", "blue", "Blue", "Yellow", "Red, Green" }; foreach (string colorString in colorStrings) { Colors colorValue; if (Enum.TryParse(colorString, out colorValue)) Console.WriteLine(colorString); } } }

    输出为:

    0

    2

    8

    Blue

    Red, Green

    问题:8 和 Red, Green 为何可以转换?

    Colors 里没这两项啊。


    • 已编辑 Dun Eysa 2013年1月17日 12:33 修改代码
    2013年1月17日 12:33

答案

  • 楼主,

    枚举有一个重要特性——是可以“或”的。

    之所以“Red,Green”可以被输出,究其原因在于你这样写等于获取了Red和Green两种颜色的枚举。

    下面可以做一个实验:

     string[] colorStrings = {  "Red,Green" };
          foreach (string colorString in colorStrings)
          {
             Colors colorValue;
             if (Enum.TryParse(colorStringout colorValue))        
                Console.WriteLine(colorValue);
             
          }

    如果直接输出“colorValue”,那么结果是“3”,恰恰是Red+Green的枚举值。(是“或”关系)。

    同理,你增加“Blue”到后面也一样——3个同时输出。

    进一步证明,请改代码如下:

    public class Example
    {
         enum Colors { None = 0Red = 1Green = 2Blue = 3 };
     
       public static void Main()
       {
          string[] colorStrings = {  "Red,Green" };
          foreach (string colorString in colorStrings)
          {
             Colors colorValue;
             if (Enum.TryParse(colorStringout colorValue))        
                Console.WriteLine(colorValue);
             
          }
       }
    }

    注意Blue是“3”,那么现在输出只有“Blue”了(甚至不对应!)Why?因为Red+Green=3,对应Blue了。

    关于“多态枚举”问题,请参考:http://www.cnblogs.com/ServiceboyNew/archive/2012/07/17/2595229.html


    帮助一起改进论坛质量?提交你的意见于此。
    我的博客园
    慈善点击,点击此处
    和谐拯救危机,全集下载,净化人心

    2013年1月18日 2:24
    版主

全部回复

  • 你把 [Flags] 注释掉试试。

    2013年1月18日 1:23
  • 你把 [Flags] 注释掉试试。

    一样的。
    2013年1月18日 1:41
  • 你把 [Flags] 注释掉试试。

    一样的。

    首先枚举值是整形,所以 8 肯定能成功,比如你可以这样写代码:Colors clr = 124。

    其次,"Red,Green"会按照字符串解析,因为它可以识别分隔符“,”,所以也可以正确解析,你可以修改为"Red|Green"测试下。

    2013年1月18日 2:15
  • 楼主,

    枚举有一个重要特性——是可以“或”的。

    之所以“Red,Green”可以被输出,究其原因在于你这样写等于获取了Red和Green两种颜色的枚举。

    下面可以做一个实验:

     string[] colorStrings = {  "Red,Green" };
          foreach (string colorString in colorStrings)
          {
             Colors colorValue;
             if (Enum.TryParse(colorStringout colorValue))        
                Console.WriteLine(colorValue);
             
          }

    如果直接输出“colorValue”,那么结果是“3”,恰恰是Red+Green的枚举值。(是“或”关系)。

    同理,你增加“Blue”到后面也一样——3个同时输出。

    进一步证明,请改代码如下:

    public class Example
    {
         enum Colors { None = 0Red = 1Green = 2Blue = 3 };
     
       public static void Main()
       {
          string[] colorStrings = {  "Red,Green" };
          foreach (string colorString in colorStrings)
          {
             Colors colorValue;
             if (Enum.TryParse(colorStringout colorValue))        
                Console.WriteLine(colorValue);
             
          }
       }
    }

    注意Blue是“3”,那么现在输出只有“Blue”了(甚至不对应!)Why?因为Red+Green=3,对应Blue了。

    关于“多态枚举”问题,请参考:http://www.cnblogs.com/ServiceboyNew/archive/2012/07/17/2595229.html


    帮助一起改进论坛质量?提交你的意见于此。
    我的博客园
    慈善点击,点击此处
    和谐拯救危机,全集下载,净化人心

    2013年1月18日 2:24
    版主