c#enum奇怪的行为

Dim*_*kin 0 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());
    }
}
Run Code Online (Sandbox Code Playgroud)

这个例子返回:"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());
    }
}
Run Code Online (Sandbox Code Playgroud)

返回"heb""heb"

有什么想法吗?

小智 6

当两个枚举值具有相同的表示时,不能保证使用哪个Enum.ToString.您可以将测试缩短到恰好Console.WriteLine(Language.Heb);.由于这两个Hebheb有效的输出,也不能保证你会得到哪一个.引用Enum.ToString:

来电者须知

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

enum Shade
{
    White = 0, Gray = 1, Grey = 1, Black = 2 
}
Run Code Online (Sandbox Code Playgroud)

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

string shadeName = ((Shade) 1).ToString("F");
Run Code Online (Sandbox Code Playgroud)