Enum Parse 中的坑

简介: Enum Parse 中的坑

发现问题

我们在开发的时候肯定会用到枚举类型(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());

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

image.png

从结果可以看出,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());
}

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

image.png

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


目录
相关文章
cannot convert parameter 1 from 'class A' to 'class A'
cannot convert parameter 1 from 'class A' to 'class A'
|
9月前
类型转换——convert、parse和try parse
类型转换——convert、parse和try parse
75 0
|
9月前
|
Python 容器
【Python标准库】argparse的add_argument() 方法介绍
【Python标准库】argparse的add_argument() 方法介绍
|
9月前
|
C#
C#中 Int32.TryParse() ConVert.ToInt32() Int32.Parse () 的区别 将字符串类型转换为数字类型
C#中 Int32.TryParse() ConVert.ToInt32() Int32.Parse () 的区别 将字符串类型转换为数字类型
35 0
|
10月前
|
机器学习/深度学习 存储
argparse库
argparse库
categorical_crossentropy与sparse_categorical_crossentropy的区别
categorical_crossentropy与sparse_categorical_crossentropy的区别
|
JSON 数据格式
parse 和parseObject 有什么区别
JSON.parse()返回的结果是Object对象
177 0
|
Python
argparse使用方法简单总结
argparse使用方法简单总结 argparse是python自带的命令行参数解析包,可以用来方便地读取命令行参数,当你的代码需要频繁地修改参数的时候,使用这个工具可以将参数和代码分离开来,让你的代码更简洁,适用范围更广。
325 0
成功解决TypeError: Value passed to parameter 'paddings' has DataType float32 not in list of allowed valu
成功解决TypeError: Value passed to parameter 'paddings' has DataType float32 not in list of allowed valu