Я использовал метод Enum.IsDefined() для строки, но я получаю False в ситуации, когда я думаю, что должен получить True. Пожалуйста, проверьте приведенный ниже код:

public enum YourEnum : int
{
    Zero = 0,
    One = 1
}

public class Program
{

    public static void Main(string[] args)
    {
        Console.WriteLine(Enum.IsDefined(typeof(YourEnum), 1));
        Console.WriteLine(Enum.IsDefined(typeof(YourEnum), 1.ToString()));
    }
} 

Демонстрация скрипта C #
Результат:

True
False

Не знаю, зачем мне False во втором случае. Любая помощь приветствуется.

9
shA.t 31 Дек 2017 в 12:03

2 ответа

Лучший ответ

Когда вы передаете строку методу IsDefined(), вы спрашиваете, есть ли значение в перечислении с таким именем . В документации говорится: :

Параметр значения может быть любым из следующих:
• Любой член типа enumType.
• Переменная, значение которой является членом перечисления типа enumType.
Строковое представление имени члена перечисления. Символы в строке должны иметь тот же регистр, что и имя члена перечисления.
• Значение базового типа enumType.

(курсив мой)

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

Но третий вариант - это то, что происходит в вашем сценарии, и строка должна соответствовать имени члена перечисления. Вы передаете строку "1", и единственные допустимые имена в перечислении - "Zero" и "One". Строка "1" не соответствует ни одному из них, поэтому IsDefined() возвращает false.

21
Peter Duniho 31 Дек 2017 в 09:10

Если вы передадите строку в качестве аргумента, он будет проверять, совпадает ли одно из имен перечисления с указанной строкой. Ниже вернется true для обоих:

Console.WriteLine(Enum.IsDefined(typeof(YourEnum), 1));
Console.WriteLine(Enum.IsDefined(typeof(YourEnum), "Zero"));

Дополнительную информацию см. В исходном коде (строка 1503). Сказав это, лучше вывести эту информацию из документации, как показал ответ @Peter Duniho, поскольку реализация может измениться: но, тем не менее, если вам интересно, исходный код есть.

7
CodingYoshi 31 Дек 2017 в 09:31