写点什么

Enum Parse 中的坑

作者:喵叔
  • 2021 年 12 月 16 日
  • 本文字数:716 字

    阅读完需:约 2 分钟

发现问题

我们在开发的时候肯定会用到枚举类型(Enmu),有时我们会将 int 转换成对应的枚举值,但是你是否遇到过从 int 转成枚举值时的坑呢?无论你是否遇到过,都请您看完这篇文章。首先我们来看一个简单的示例:


public enum City: byte{    BeiJing= 0,    ShangHai = 1,    ShenZhen= 2,    WuHan=3}Console.WriteLine(((City)100).ToString());var intValue = int.MaxValue;Console.WriteLine(((City)intValue).ToString());
复制代码


在这里我想问一下各位读者,上面的代码运行是否报错?要想知道是否会报错,最好的方法是运行起来看看。上面的代码输出结果如下:



从结果可以看出,int 值直接转换成枚举值的时候,结果不是我们所希望的抛出异常,针对这个问题我们该如何处理呢?下面我们就来讲讲解决办法。

解决问题

Enum 中的 Parse 方法除了支持从 Name 字符串转换为枚举值外,还支持从数字字符串转换为枚举值,例子如下:


//从数字字符串转换为枚举值if (Enum.TryParse("100", out City city1)    && Enum.IsDefined(typeof(City), city1)){    Console.WriteLine($"城市是:{city1}");}else{    Console.WriteLine("不是枚举对应的数值");}//Name字符串转换为枚举值if (Enum.TryParse("HongKong", out City city2)){    Console.WriteLine(city2.ToString());}
复制代码


上面代码的输出结果如下:



从代码中看出什么了吗?我们在 Name 字符串转换为枚举值时按照以往的方式来编写代码,但是在从数字字符串转换为枚举值时,我们使用了 Enum.IsDefined 方法来确定 city1 是否是枚举 City 实际定义的内容。因此当我们从数值字符串转换成枚举的时候需要注意,即使数值在枚举中未定义它也会转换成功,这时就应该使用 IsDefined 方法来确保枚举定义了对应的值。

用户头像

喵叔

关注

还未添加个人签名 2020.01.14 加入

还未添加个人简介

评论

发布
暂无评论
Enum Parse 中的坑