zoukankan      html  css  js  c++  java
  • 小心 Enum Parse 中的坑

    小心 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

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    封装ANSI,UNICODE,UTF8互相转换类
    关于编码ansi、GB2312、unicode与utf-8的区别
    dojo中引入FusionCharts柱状图报错
    FusionCharts 3D环饼图报错
    FusionCharts 3D环饼图
    FusionCharts 2D环饼图
    error:WINDOWS.H already included错误解释
    正视心中野兽是与孩子共处的救赎之路——Leo鉴书44
    dojo中取查询出来的地市维表数据的id
    FusionCharts封装-单系列图组合
  • 原文地址:https://www.cnblogs.com/weihanli/p/14370372.html
Copyright © 2011-2022 走看看