0

次の例を考えてみましょう。列挙値をオーバーライドして、大文字だけでなく列挙型を解析できるようにしようとしています。

    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」を返します

理由はありますか?

4

1 に答える 1

6

2 つの列挙値の表現が同じ場合、 でどちらが使用されるかは保証されませんEnum.ToString。テストを短くすることができますConsole.WriteLine(Language.Heb);Hebとの両方hebが有効な出力であるため、どちらが得られるかは保証されません。Enum.ToStringからの引用:

発信者への注意事項

複数の列挙型メンバーが同じ基になる値を持ち、その基になる値に基づいて列挙型メンバーの名前の文字列表現を取得しようとする場合、メソッドが返す名前についてコードで仮定を行うべきではありません。たとえば、次の列挙は、同じ基になる値を持つ 2 つのメンバー Shade.Gray と Shade.Grey を定義します。

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

次のメソッド呼び出しは、基礎となる値が 1 である Shade 列挙のメンバーの名前を取得しようとします。このメソッドは、"Gray" または "Grey" を返すことができます。コードでは、どの文字列が返されるかについて何も仮定しないでください。

string shadeName = ((Shade) 1).ToString("F");
于 2013-06-09T09:58:53.077 に答える