小心 Enum Parse 中的坑

Intro

最近使用枚举的时候,踩了一个小坑,分享一下,主要是枚举从 int 值转成枚举时可能会遇到

Sample

来看下面的示例:

首先定义一个枚举:

public enum Color : byte
{Red = 0,Green = 1,Blue = 2,
}

来看一下下面的代码,下面的代码会抛异常吗?

Console.WriteLine(((Color)10).ToString());

再来看下面的代码,下面的代码又会怎么样呢,输出结果是什么?

var intValue = int.MaxValue;
Console.WriteLine(((Color)intValue).ToString());

输出结果如下:

从上面的结果看得出来,从 int 值直接做转换的时候,结果可能并不是期望的,不会抛异常,那么又该如何处理呢?我们再来看一个示例

ParseSample

EnumParse 方法不仅支持从 Name 的字符串比如前面定义的枚举中的 Red/Green,还可以支持从 int 的字符串也就是 0/1/2 ,来看下面的示例:

if (Enum.TryParse("10", out Color color))
{Console.WriteLine(color.ToString());
}if (Enum.TryParse("10", out Color color1)&& Enum.IsDefined(typeof(Color), color1))
{Console.WriteLine($"Success, {color1}");
}
else
{Console.WriteLine("Can not match");
}

来直接看输出结果吧:

Parse from name

再来看一个从 Name 转换的一个示例:

if (Enum.TryParse("Yellow", out Color color2))
{Console.WriteLine(color2.ToString());
}

这个不会有任何输出,TryParse 会直接返回 false

More

当枚举从 int 值转换的时候,需要小心,即使 int 值在枚举中没有定义也会转换成功,如果要确保枚举中定义了对应的值时,应该使用 IsDefined 来确保枚举定义了对应的值

Reference

  • https://docs.microsoft.com/en-us/dotnet/api/system.enum.tryparse?view=net-5.0

小心 Enum Parse 中的坑相关推荐

  1. 小心Lombok用法中的坑

    刚才写完了代码,自测的时候,出现了NPE问题. 排查的时候发现是Lombok的坑,以前也遇到过,所以觉得有必要过来记录一下. 我先描述一下现象,我的代码里面订单服务A 需要调用缓存服务B,服务B就是一 ...

  2. (四)Asp.net web api中的坑-【api的返回值】

    (四)Asp.net web api中的坑-[api的返回值] 原文:(四)Asp.net web api中的坑-[api的返回值] void无返回值 IHttpActionResult HttpRe ...

  3. JDK中的坑:JDK中这些方法的bug你不要踩

    点击关注公众号,Java干货及时送达 图片来源:白夜追凶 前言: jdk作为我们每天必备的调用类库,里面大量提供了基础类供我们使用.可以说离开jdk,我们的java代码寸步难行,jdk带给我们的便利可 ...

  4. 学习笔记---取得枚举项的2种方法: Enum.GetValues()-Array.GetValue()和Enum.GetNames()-Enum.Parse()...

    代码 namespace EnumDemo { public enum Color { red = 0, orange =1, yellow =2, green=4, blue =5, cyan =6 ...

  5. C# System.Timers.Timer中的坑,程序异常退出后timer依然运行问题

    C# System.Timers.Timer中的坑,程序异常退出后timer依然运行问题 参考文章: (1)C# System.Timers.Timer中的坑,程序异常退出后timer依然运行问题 ( ...

  6. 决策树python建模中的坑 :ValueError: Expected 2D array, got 1D array instead:

    决策树python建模中的坑 代码 #coding=utf-8 from sklearn.feature_extraction import DictVectorizerimport csvfrom ...

  7. 小心VB.NET中的除运算符/和/

    小心VB.NET中的除运算符"/"和"/" VB.NET中除运算符有两种,普通除"/"和整数除"/",如果我们写程序时不 ...

  8. 0编译器详解_详解Java枚举类型(Enum)中的方法

    文章前记 程序员工作久了便可能整日忙碌于"增删改查"中,迷失方向,毫无进步. 该公众号致力于分享软件开发相关的原创干货,助你完成从程序员到架构师的进阶之路! 努力!做一个NB的Co ...

  9. mysql 主从 通俗易懂_MySQL 主从同步架构中你不知道的“坑”(完结篇)

    MySQL 主从同步架构中你不知道的"坑"(完结篇) 收录于话题 #MySQL从入门到放弃 26个 点击上方蓝字,关注我们哟! 前言导读 之前写出一篇文章也是关于这个主从同步架构的 ...

最新文章

  1. Xamarin Anroid App访问网站失败
  2. linux下载文件的常用命令wget
  3. Java NIO学习系列二:Channel
  4. ML之二分类预测:以岩石水雷数据集(RockMine)为例从0到1深入理解科学预测之分类问题的思路框架(特征工程详细步骤(特征分析与特征处理)+分类模型设计)
  5. More Effective C# Item3 : 运行时检查泛型参数的类型并提供特定的算法
  6. Android入门(15)| 网络
  7. 螺旋数组算法[中篇]--常规数学分析
  8. 拓端tecdat|stata具有异方差误差的区间回归
  9. html是用来表示网上信息的符号标记语言,html标记的一般格式
  10. 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
  11. 驾考维语版本-维语驾考手机电脑版-民语驾考网
  12. Windows 8 平板电脑体验及思考
  13. web 打开pdf文件
  14. Python 玩转数据 8 - Pandas Indexing and Slicing
  15. 微博运营怎么做才能吸引更多的粉丝?
  16. AngularJS学习笔记-2
  17. 计算机专业去,计算机专业去哪个学校_西信院
  18. 小米路由器安装mysql_小米路由器安装和设置方法(图文教程)
  19. U3D中的常用字符串加密算法程序
  20. Linux编译命令 make -j8 的意义

热门文章

  1. 升级tomcat7.0之后的问题
  2. codevs原创抄袭题 5960 信使
  3. 分析windows宿主机Ping不通linux虚拟机的其中一种情况
  4. hashtable与HashMap区别
  5. 使用timer控件创建一个简单的报警程序
  6. 在Teams Hackathon上介绍LuckyDraw
  7. Android One和Android Go有什么区别?
  8. chrome怎么隐藏浏览器_如何使用Google Chrome的隐藏阅读器模式
  9. 百度php editor图片上传到其他盘,百度编辑器Editor图片独立上传
  10. drools简单应用