67915


enumの重複したメンバーを文字列化すると定義の順番に関わらずどちらかの文字列に変換されるのですが、この法則がわかりません。  
どのようなルールで文字列が決定されるのでしょうか？

[code]

    using System;
    
    namespace EnumTest
    {
        class Program
        {
            // 例：System.Windows.Input.Key の一部
            public enum Key
            {
                Oem4 = 149,
                OemOpenBrackets = 149,
                Oem5 = 150,
                OemPipe = 150,
            }
    
            static void Main(string[] args)
            {
                Console.WriteLine(Key.Oem4);
                Console.WriteLine(Key.OemOpenBrackets);
                Console.WriteLine(Key.Oem5);
                Console.WriteLine(Key.OemPipe);
    
                // 出力結果：
                // OemOpenBrackets
                // OemOpenBrackets
                // Oem5
                // Oem5
            }
        }
    }
    
[/code]


CC BY-SA 4.0
2020-06-23T05:34:34.003
67914
2020-06-23T06:00:40.050
14817
question
c#
C#のenumの重複したメンバーが文字列化されるときの法則は？


法則は明示されていません。  
現在の出力結果から法則性を見出しても、今後の実装で同一の結果が返ってくるとは限りません。

[本家SOの関連質問](https://stackoverflow.com/q/26321509)

[MSDN](https://docs.microsoft.com/en-
us/dotnet/api/system.enum.tostring?view=netcore-3.1#System_Enum_ToString_System_String_)から
_Notes to Callers_ を引用します。

> If multiple enumeration members have the same underlying value and you
> attempt to retrieve the string representation of an enumeration member's
> name based on its underlying value, your code should not make any
> assumptions about which name the method will return. For example, the
> following enumeration defines two members, Shade.Gray and Shade.Grey, that
> have the same underlying value.

**雰囲気訳:**
複数の列挙型の値が同一の基本値を持ち、基本値から列挙型メンバーの名前を文字列化しようとする場合、コードで(ToString)メソッドが返す名前を仮定しないでください。  
たとえば、次の列挙は、同じ基本値を持つ2つのメンバー`Shade.Gray`と`Shade.Grey`を定義します。

[code]

    enum Shade
    {
        White = 0, Gray = 1, Grey = 1, Black = 2
    }
    
[/code]

> The following method call attempts to retrieve the name of a member of the
> Shade enumeration whose underlying value is 1. The method can return either
> "Gray" or "Grey", and your code should not make any assumptions about which
> string will be returned.

**雰囲気訳:** 次の(ToString)メソッドは、基本値が1であるShade列挙体のメンバーの名前を取得しようとします。  
メソッドは "Gray"または "Grey"のどちらでも返すことができます。このコードを使用してどちらの文字列が返されるかについて想定しないでください。

[code]

    string shadeName = ((Shade) 1).ToString("F");
    
[/code]


CC BY-SA 4.0
2020-06-23T06:00:40.050
67915
2020-06-23T06:00:40.050
9820
67914
answer