踩坑了,C#枚舉轉(zhuǎn)換要小心!
小心 Enum Parse 中的坑
Intro
最近使用枚舉的時(shí)候,踩了一個(gè)小坑,分享一下,主要是枚舉從 int 值轉(zhuǎn)成枚舉時(shí)可能會遇到
Sample
來看下面的示例:
首先定義一個(gè)枚舉:
public?enum?Color?:?byte
{
????Red?=?0,
????Green?=?1,
????Blue?=?2,
}
來看一下下面的代碼,下面的代碼會拋異常嗎?
Console.WriteLine(((Color)10).ToString());
再來看下面的代碼,下面的代碼又會怎么樣呢,輸出結(jié)果是什么?
var?intValue?=?int.MaxValue;
Console.WriteLine(((Color)intValue).ToString());
輸出結(jié)果如下:

從上面的結(jié)果看得出來,從 int 值直接做轉(zhuǎn)換的時(shí)候,結(jié)果可能并不是期望的,不會拋異常,那么又該如何處理呢?我們再來看一個(gè)示例
ParseSample
Enum 的 Parse 方法不僅支持從 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");
}
來直接看輸出結(jié)果吧:

Parse from name
再來看一個(gè)從 Name 轉(zhuǎn)換的一個(gè)示例:
if?(Enum.TryParse("Yellow",?out?Color?color2))
{
????Console.WriteLine(color2.ToString());
}
這個(gè)不會有任何輸出,TryParse 會直接返回 false
More
當(dāng)枚舉從 int 值轉(zhuǎn)換的時(shí)候,需要小心,即使 int 值在枚舉中沒有定義也會轉(zhuǎn)換成功,如果要確保枚舉中定義了對應(yīng)的值時(shí),應(yīng)該使用 IsDefined 來確保枚舉定義了對應(yīng)的值
Reference
https://docs.microsoft.com/en-us/dotnet/api/system.enum.tryparse?view=net-5.0


ASP.NET Core推薦使用可空引用類型?

副業(yè)剛需,個(gè)人開發(fā)者如何通過小程序變現(xiàn)?已經(jīng)有朋友變現(xiàn)月入4k了!
評論
圖片
表情
