小心 Enum Parse 中的坑

WeihanLi發表於2021-02-03

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

相關文章