Странное Разрешение Имён Перечислений в C#
Рассмотрим следующий код:
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);
}
}
}
B, B, B. Это поведение одинаково и в .NET Framework, и в .NET Core 3.x, и в .NET 5.Почему он выбирает
B?Согласно документации для
Enum.GetName():Если несколько членов перечисления имеют одно и то же значение, метод GetName гарантирует, что он вернёт имя одного из этих членов перечисления. Однако он не гарантирует, что всегда будет возвращать имя одного и того же члена перечисления.
Так что формально могло бы возвратиться что угодно. Почему же всё-таки возвращается
B?За объяснением можно обратиться к реализации GetEnumName().
Чтобы ускорить работу алгоритма, используется бинарный поиск. А он начинает с середины коллекции. Вот почему он находит значение B, которое расположено как раз в середине упорядоченного списка. Обратите внимание, что список упорядочивается по значению перечисления, а не по имени, но в нашем случае он уже упорядочен, поскольку все значения одинаковы.
Источник: https://stackoverflow.com/questions/67091644/weird-enum-name-resolution-in-c-sharp