Преобразование числовых строк в enum в C # - PullRequest
1 голос
/ 23 марта 2019

Недавно я обнаружил, что любая строка, содержащая только числовые символы, может быть преобразована в enum в C #.Например, представьте, что существует перечисление, определенное следующим образом:

public enum TestEnum
{
    One = 1,
    Two = 2,
    Three = 3
};

Я могу выполнить преобразование некоторой случайной числовой строки в TestEnum.

TestEnum testEnum = (TestEnum)Enum.Parse(typeof(TestEnum), "4");
Console.WriteLine(testEnum);

Значение '4'конечно, не сопоставляется с одним из определенных TestEnum значений, и результат будет просто 4, однако ошибки не будет, поэтому это преобразование допустимо.

С другой стороны, если япопробуйте проверить, будет ли это значение, определенное в TestEnum:

Console.WriteLine(Enum.IsDefined(typeof(TestEnum), "4"));

, получать на выходе False.

Это кажется мне немного странным, учитывая, чтоследующее преобразование нечисловой строки, например,

(TestEnum)Enum.Parse(typeof(TestEnum), "Test")

, выдаст System.ArgumentException.

Я запутался с таким поведением.Это было сделано намеренно или это просто совпадение?

1 Ответ

3 голосов
/ 23 марта 2019

Было ли это сделано специально или это просто совпадение?

Я не уверен, что понимаю ваш вопрос. Документация мне кажется совершенно понятной:

Преобразует строковое представление имени или числовое значение одной или нескольких перечисляемых констант в эквивалентный перечисляемый объект.

(Акцент мой)

Там также сказано:

Если значение является строковым представлением целого числа, которое не представляет базовое значение перечисления enumType, метод возвращает член перечисления, базовое значение которого является значением, преобразованным в целочисленный тип. Если такое поведение нежелательно, вызовите метод IsDefined, чтобы убедиться, что конкретное строковое представление целого числа действительно является членом enumType

Очевидно, что это намеренное поведение, а не просто случайное.

Обратите внимание, что вы всегда можете привести любое значение базового типа enum (в данном случае int) к самому типу enum. Функция типа enum не обязывает значения enum соответствовать именованным значениям. Таким образом, поведение при разборе полностью соответствует поведению во время компиляции enum типов.

Полагаю, можно спорить о том, должен ли тип enum разрешать использование безымянных значений. Но, учитывая, что одна из особенностей enum типов заключается в том, чтобы разрешать перечисления на основе флагов, независимо от того, имеют ли они атрибут [Flags], и учитывая, что было бы неудобно (если не сказать больше) иметь имя каждая комбинация каждого отдельного флага, определенного в типе enum, кажется разумным, что они пойдут дальше и разрешат неназванные значения для всех типов enum типов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...