c#enum奇怪的行为

时间:2013-06-09 09:45:12

标签: c# enums

考虑以下示例,我尝试覆盖枚举值,以便能够使用大写字母解析枚举:

    public enum Language
{

    Heb,
    Eng,
    heb = Heb,
    eng = Eng
}

class Program
{
    static void Main(string[] args)
    {
        var e = "heb";
        Language result;

        Enum.TryParse(e, out result);

        Console.WriteLine(result);
        Console.WriteLine(result.ToString());
    }
}

此示例返回:“Heb”“Heb”

另一方面,这个例子:

    public enum Language
{

    Heb,
    Eng,
    heb = Heb,
    eng = Eng,
    None
}

class Program
{
    static void Main(string[] args)
    {
        var e = "heb";
        Language result;

        Enum.TryParse(e, out result);

        Console.WriteLine(result);
        Console.WriteLine(result.ToString());
    }
}

返回“heb”“heb”

任何想法为什么?

1 个答案:

答案 0 :(得分:6)

当两个枚举值具有相同的表示形式时,Enum.ToString无法保证使用哪个枚举值。您可以将测试缩短到Console.WriteLine(Language.Heb);。由于Hebheb都是有效输出,因此无法保证您获得哪一项。引自Enum.ToString

  

来电者须知

     

如果多个枚举成员具有相同的基础值,并且您尝试根据其基础值检索枚举成员名称的字符串表示形式,则您的代码不应对该方法将返回的名称做出任何假设。例如,以下枚举定义了两个具有相同基础值的成员Shade.Gray和Shade.Grey。

enum Shade
{
    White = 0, Gray = 1, Grey = 1, Black = 2 
}
     

以下方法调用尝试检索其底层值为1的Shade枚举成员的名称。该方法可以返回“Gray”或“Gray”,并且您的代码不应该对哪个字符串将做出任何假设被退回。

string shadeName = ((Shade) 1).ToString("F");