积极答复者
【百思不得其解】Enum枚举类型的转换!

问题
-
[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 修改代码
答案
-
楼主,
枚举有一个重要特性——是可以“或”的。
之所以“Red,Green”可以被输出,究其原因在于你这样写等于获取了Red和Green两种颜色的枚举。
下面可以做一个实验:
string[] colorStrings = { "Red,Green" }; foreach (string colorString in colorStrings) { Colors colorValue; if (Enum.TryParse(colorString, out colorValue)) Console.WriteLine(colorValue); }
如果直接输出“colorValue”,那么结果是“3”,恰恰是Red+Green的枚举值。(是“或”关系)。
同理,你增加“Blue”到后面也一样——3个同时输出。
进一步证明,请改代码如下:
public class Example { enum Colors { None = 0, Red = 1, Green = 2, Blue = 3 }; public static void Main() { string[] colorStrings = { "Red,Green" }; foreach (string colorString in colorStrings) { Colors colorValue; if (Enum.TryParse(colorString, out colorValue)) Console.WriteLine(colorValue); } } }
注意Blue是“3”,那么现在输出只有“Blue”了(甚至不对应!)Why?因为Red+Green=3,对应Blue了。
关于“多态枚举”问题,请参考:http://www.cnblogs.com/ServiceboyNew/archive/2012/07/17/2595229.html
- 已编辑 ThankfulHeartModerator 2013年1月18日 2:33
- 已建议为答案 Mike FengModerator 2013年1月18日 15:45
- 已标记为答案 Mike FengModerator 2013年1月23日 13:57
全部回复
-
楼主,
枚举有一个重要特性——是可以“或”的。
之所以“Red,Green”可以被输出,究其原因在于你这样写等于获取了Red和Green两种颜色的枚举。
下面可以做一个实验:
string[] colorStrings = { "Red,Green" }; foreach (string colorString in colorStrings) { Colors colorValue; if (Enum.TryParse(colorString, out colorValue)) Console.WriteLine(colorValue); }
如果直接输出“colorValue”,那么结果是“3”,恰恰是Red+Green的枚举值。(是“或”关系)。
同理,你增加“Blue”到后面也一样——3个同时输出。
进一步证明,请改代码如下:
public class Example { enum Colors { None = 0, Red = 1, Green = 2, Blue = 3 }; public static void Main() { string[] colorStrings = { "Red,Green" }; foreach (string colorString in colorStrings) { Colors colorValue; if (Enum.TryParse(colorString, out colorValue)) Console.WriteLine(colorValue); } } }
注意Blue是“3”,那么现在输出只有“Blue”了(甚至不对应!)Why?因为Red+Green=3,对应Blue了。
关于“多态枚举”问题,请参考:http://www.cnblogs.com/ServiceboyNew/archive/2012/07/17/2595229.html
- 已编辑 ThankfulHeartModerator 2013年1月18日 2:33
- 已建议为答案 Mike FengModerator 2013年1月18日 15:45
- 已标记为答案 Mike FengModerator 2013年1月23日 13:57