A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 周培 中级黑马   /  2013-8-5 22:05  /  1822 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 周培 于 2013-8-17 12:13 编辑
  1. enum Gender
  2. {
  3.      男,
  4.      女
  5. }
  6. //-------------------------------
  7. Gender sex;
  8. Console.WriteLine("请输入性别?");
  9. string str = Console.ReadLine();
  10. try
  11. {
  12.     //将用户输入的字符串转换成枚举类型
  13.     sex = (Gender)Enum.Parse(typeof(Gender), str);
  14.     Console.WriteLine("您输入的性别为"+sex);
  15. }
  16. catch
  17. {
  18.     Console.WriteLine("您的输入有误,只能输入男或女");
  19. }
复制代码
代码:
如上代码,当输入数字,比如5的时候,也能够执行:您输入的性别为5。这是为什么?

评分

参与人数 1技术分 +1 收起 理由
赵宗荣 + 1

查看全部评分

5 个回复

倒序浏览
1方法原型为:
  1. [ComVisibleAttribute(true)]
  2. public static Object Parse(
  3.         Type enumType,
  4.         string value
  5. )
复制代码
将一个或多个枚举常数的名称或数字值的字符串表示转换成等效的枚举对象。

2参数说明:enumType   类型:System.Type 枚举类型。value  类型:System.String 包含要转换的值或名称的字符串。

3参数value:如果 value 是一个不与 enumType 的命名常数对应的名称,则此方法将引发 ArgumentException。 如果 value 是一个不表示 enumType 枚举基础值的整数的字符串表示形式,则此方法将返回基础值是已转换为整型的 value 的枚举成员。

这就解释楼主输入5也可以啊,使用方法的时候可以查查msdn,上面解释很详细。解决输入超出定义的枚举值对应数值返回的方法:可以调用Enum的 IsDefined 方法。
代码如:
  1. using System;

  2. [Flags] enum Colors { None=0, Red = 1, Green = 2, Blue = 4 };

  3. public class Example
  4. {
  5.    public static void Main()
  6.    {
  7.       string[] colorStrings = { "0", "2", "8", "blue", "Blue", "Yellow", "Red, Green" };
  8.       foreach (string colorString in colorStrings)
  9.       {
  10.          try {
  11.             Colors colorValue = (Colors) Enum.Parse(typeof(Colors), colorString);        
  12.             if (Enum.IsDefined(typeof(Colors), colorValue) | colorValue.ToString().Contains(","))  
  13.                Console.WriteLine("Converted '{0}' to {1}.", colorString, colorValue.ToString());
  14.             else
  15.                Console.WriteLine("{0} is not an underlying value of the Colors enumeration.", colorString);
  16.          }
  17.          catch (ArgumentException) {
  18.             Console.WriteLine("'{0}' is not a member of the Colors enumeration.", colorString);
  19.          }
  20.       }
  21.    }
  22. }
  23. // The example displays the following output:
  24. //       Converted '0' to None.
  25. //       Converted '2' to Green.
  26. //       8 is not an underlying value of the Colors enumeration.
  27. //       'blue' is not a member of the Colors enumeration.
  28. //       Converted 'Blue' to Blue.
  29. //       'Yellow' is not a member of the Colors enumeration.
  30. //       Converted 'Red, Green' to Red, Green.
复制代码

评分

参与人数 1技术分 +1 收起 理由
赵宗荣 + 1

查看全部评分

回复 使用道具 举报 1 0
sxdxgzr@126.com 发表于 2013-8-5 22:17
1方法原型为:将一个或多个枚举常数的名称或数字值的字符串表示转换成等效的枚举对象。

2参数说明:enumType ...


将字符串转换成枚举类型,如果字符串是一个不表示枚举基础值的整数,则返回这个整数。如果转换失败则产生ArgumentException异常。
可以用Enum.IsDefind()方法来判断字符串是否是一个表示枚举基础值的整数,false则是一个整数。
是否是这样?根据你的回答,这样理解没错吧?
回复 使用道具 举报
不对啊,理解错了。是这样的:

[Flags] enum Colors { None=0, Red = 1, Green = 2, Blue = 4 };
如果你传的字符串为"None","Red ","Green ","Blue "中任意一个,转换会成功,如果不是上面几个且非整数值对应的字符串,转换失败抛异常ArgumentException。

如果你传的字符串为整数对应的字符串"1","2","4","0" 则能正确转换,但是比如说传“5”也能正确转换,这个时候并不是你想要的结果,此时就用Enum.IsDefind()方法来判断。如上面的列子啊。

回复 使用道具 举报
enum Gender
{
     男,
     女
}          男是0,女是1,所以可以用数字来表示里面的枚举值。5就代表Gender里的第4个,没有值就只能显示5了。现在只能用我学过的知识这么回答了。你可以输入一个0试试它会显示男。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
周培 来自手机 中级黑马 2013-8-17 12:11:47
地板
sxdxgzr@126.com 发表于 2013-8-6 20:45
不对啊,理解错了。是这样的:

[Flags] enum Colors { None=0, Red = 1, Green = 2, Blue = 4 };

明白了,谢谢!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马