Considere el siguiente código:
using System; namespace Test { enum Foo { A = 1, B = 1, C = 1 } public static class Program { public static void Main() { Console.WriteLine("{0}, {1}, {2}", Foo.A, Foo.B, Foo.C); } } } Sabiendo que las enumeraciones son solo números enteros debajo del capó, esperaba que fuera A, A, A o C, C, C Pero, sorprendentemente, ¡imprime B, B, B ! Este comportamiento parece ser coherente en .NET Framework, .NET Core 3.x y .NET 5.
¿Por qué elige B ?
No está definido según la documentación de Enum.GetName():
Si varios miembros de la enumeración tienen el mismo valor subyacente, el método GetName garantiza que devolverá el nombre de uno de esos miembros de la enumeración. Sin embargo, no garantiza que siempre devolverá el nombre del mismo miembro de la enumeración.
Así que puede hacer lo que quiera en este sentido.
En cuanto a por qué devuelve B en su ejemplo, podemos inspeccionar la implementación de GetEnumName() :
public virtual string GetEnumName(object value) { if (value == null) throw new ArgumentNullException("value"); if (!IsEnum) throw new ArgumentException(Environment.GetResourceString("Arg_MustBeEnum"), "enumType"); Contract.EndContractBlock(); Type valueType = value.GetType(); if (!(valueType.IsEnum || Type.IsIntegerType(valueType))) throw new ArgumentException(Environment.GetResourceString("Arg_MustBeEnumBaseTypeOrEnum"), "value"); Array values = GetEnumRawConstantValues(); int index = BinarySearch(values, value); if (index >= 0) { string[] names = GetEnumNames(); return names[index]; } return null; } ¡Ajá! Todo está explicado. Para hacer la búsqueda más rápida, usaron una búsqueda binaria. ¿Y cuál es el primer lugar que busca una búsqueda binaria al iniciar la búsqueda? Así es, comienza a la mitad de la lista. Y es por eso que está encontrando la B primero: después de ordenar la lista, la B está en el medio.
(Tenga en cuenta que la lista está ordenada por valor de enumeración, no por nombre de enumeración, por lo que para su caso, la lista ya está ordenada ya que todos los valores son iguales).