使用Enum.Prase及Enum.TryPrase时的注意事项

因为一个程序BUG发现的奇怪问题,以前完全不知道要这样写

如果说需要验证一个字符串是否符合一个枚举

可以用

(枚举类型)Enum.Parse(typeof(枚举类型),"要验证的信息");

可以得到 枚举类型 的 实例,如果不在枚举里就会报错

要验证的信息 可以是 文本,也可以是 数字

比如

  enum 销售类型
    {
        A型 = 1,
        B型 = 2
    }

    class Program
    {
        static void Main(string[] args)
        {
            销售类型 a = (销售类型)Enum.Parse(typeof(销售类型), "A型");
            Console.WriteLine("{0} value is {1}", a.ToString(), (int)a);

            销售类型 b = (销售类型)Enum.Parse(typeof(销售类型), "2");
            Console.WriteLine("{0} value is {1}", b.ToString(), (int)b);

            销售类型 c = (销售类型)Enum.Parse(typeof(销售类型), "3");
            Console.WriteLine("{0} value is {1}", c.ToString(), (int)c);
            
            Console.ReadKey();
        }
    }

你可以把 "A型" 或者 "2" 导入,都没有问题

但是TMD!!!!

如果你导入了 “3”, 这个是不在枚举,但是他不会报错,用 Enum.TryParse 也不会返回false

他会成功转换成 3 给你。。。。。。。。。卧槽

MSDN是这样解释的

所以,上面那段代码正确的写法是

 enum 销售类型
    {
        A型 = 1,
        B型 = 2
    }

    class Program
    {
        static void Main(string[] args)
        {
            销售类型 a = (销售类型)Enum.Parse(typeof(销售类型), "A型");
            Console.WriteLine("{0} value is {1}", a.ToString(), (int)a);

            销售类型 b = (销售类型)Enum.Parse(typeof(销售类型), "2");
            Console.WriteLine("{0} value is {1}", b.ToString(), (int)b);

            销售类型 c = (销售类型)Enum.Parse(typeof(销售类型), "3");
            if (Enum.IsDefined(typeof(销售类型), c))
            {
                Console.WriteLine("{0} value is {1}", c.ToString(), (int)c);
            }
            else
            {
                Console.WriteLine("{0} is not an underlying value of the enumeration.", c.ToString());
            }

            Console.ReadKey();
        }
    }

嗯,人生从未有如此酸爽的感觉......

时间: 2024-10-03 02:07:56

使用Enum.Prase及Enum.TryPrase时的注意事项的相关文章

C语言--enum,typedef enum 枚举类型详解

原文:http://z515256164.blog.163.com/blog/static/32443029201192182854300/ 有改动 C语言详解 - 枚举类型 注:以下全部代码的执行环境为VC++ 6.0 在程序中,可能需要为某些整数定义一个别名,我们可以利用预处理指令#define来完成这项工作,您的代码可能是: #define MON 1 #define TUE 2 #define WED 3 #define THU 4 #define FRI 5 #define SAT 6

李洪强iOS开发之 - enum与typedef enum的用法

李洪强iOS开发之 - enum与typedef enum的用法 01 - 定义枚举类型 上面我们就在ViewController.h定义了一个枚举类型,枚举类型的值默认是连续的自然数,例如例子中的TO_BE_PAID=0,//开始   那么其后的就依次为1,2,3....所以一般只需要设置枚举中第一个的值就可以. 注意: 在定义枚举类型的时候一定要定义在.h中的#imort 和€interface之间定义,位置不能错了 02 - 定义操作类型 enum和enum typedef 在IOS中的使

Enum<E extends Enum<E>>类和排序算法

1 Enum<E extends Enum<E>>类 这是所有 Java 语言枚举类型的公共基本类. 2 常见排序算法 冒泡法.简单.比较小的需求可以采用此方法. 快速排序.确定关键字,将数据分为小于和大于关键字两部分.然后递归快排这两部分. 插入排序.将数据分为有序和无序两部分,逐一遍历无序部分,将记录逐条插入有序部分.有改进的折半插入排序,即插入的时候采用二分查找确认插入位置. 希尔排序.将数据间隔分组,组内进行插入排序.间隔逐次递减,直至为1. 选择排序.将数据分为有序和无序

局部变量与全局变量在声明时的注意事项

/* ============================================================================ Name : TestVariable.c Author : lf Version : Copyright : Your copyright notice Description : 局部变量与全局变量在声明时的注意事项 全局变量只能要常量赋值,但是局部变量可用常量和表达式以及函数赋值. 这是为什么呢? 程序在开始执行时需要用适当的值来初

使用MySQL-Proxy读写分离时的注意事项

在动手操作前最好先安装好MySQL-Proxy,并配置好MySQL主从服务器.补充:新版MySQL已经内建支持 延迟问题 读写分离不能回避的问题之一就是延迟,可以考虑Google提供的SemiSyncReplicationDesign补丁. 端口问题 MySQL-Proxy缺省使用的是4040端口,如果你想透明的把3306端口的请求转发给4040的话,那么可以: iptables -t nat -I PREROUTING -s ! 127.0.0.1 -p tcp --dport 3306 -j

页面重构时的注意事项

页面重构时的注意事项 1. 重构页面时,什么样的代码才算是好的代码? 2. 重构时如何告诉设计师,他设计的东西太丑? 1. 重构页面时,什么样的代码才算是好的代码? 这个我感觉要从三方面来做答,基础的就不说了,那些语义化,结构化,兼容性等等方面的问题.说说中级部分的: 页面的健壮性: 这个怎么说呢,按我的理解,UI出的psd图是一个页面理想状态下的形态,而真实上线后,会出现三种极端状态,一,数据极多,二,数据极少,三,数据刚好(其实就是PSD设置描述的一个状态).所以在页面排版的时候,考虑这设计

给电脑系统备份时的注意事项

给电脑系统备份时的注意事项 当你的电脑随着使用时间变长,由于各类程序的安装,或许会出现各式各样的系统问题,如系统经常崩溃,病毒突然来袭等等.给电脑系统备份是必然的一个选择.那么在进行系统备份之前我们应该注意哪些事项呢? 首先如果你选择系统自带的备份工具,那么请确定你自己完全能够自行操作,以免误操作导致电脑不能使用. 可以对你的系统盘(C盘)里面的垃圾文件进行简单清理(可以去网上查下那些C盘文件是可以进行清理的),这样备份出来的镜像文件会更小,备份时间也不会那么长. 建议备份系统的时候最好是你重新

SSH框架整合jar包时的注意事项

SSH框架整合jar包时的注意事项: 在将三个框架所需的jar整合到一起后,要看一下有没有相同类型但是版本不同的jar包,如果有的话,需要把低版本的jar包删除掉,否则会报错.我这里整合的时候javassit的jar出现了两个不同版本的,需要把低版本的删除掉. 原文地址:https://www.cnblogs.com/wyhluckdog/p/10139375.html

java.lang.Enum&lt;E extends Enum&lt;E&gt;&gt;

public enum Direction { L, LU, U, RU, R, RD, D, LD, STOP, JUMP;} for(Direction d: Direction.values()) { this.drawPaoTong(g, d); } for (int i = 0; i < Direction.values().length; i++) { Direction.values()[i]; } 枚举随机遍历:Direction.values()[new Random().ne