Перечисления и нет полей со значением '0' - PullRequest
4 голосов
/ 24 ноября 2011

Я сделал следующий тестовый код:

public enum Test
{
    One = 1,
    Two = 2
}
public class User
{
    public Test Flag { get; set; }
}

, который я использую следующим образом:

var user = new User();
var value = typeof(Test).GetField(user.Flag.ToString());

Значение будет null, так как кажется, что User.Flagинициализируется с 0.Это почему?0 не является допустимым значением для моего перечисления.Не должно ли оно быть инициализировано первым допустимым значением (1)?

Ответы [ 4 ]

3 голосов
/ 24 ноября 2011

Перечисления поддерживаются целочисленными типами и ведут себя как они (в основном).

К сожалению, это означает, что вы можете присвоить любое значение , которое является допустимым для базового типа, для перечисления - проверка не производится.

В случае инициализации по умолчанию это будет значение по умолчанию базового типа, которое для целочисленных типов равно 0.

Вы также можете сделать это, и он скомпилируется и запустится:

var value = (Test)43;

Возможно, переопределите ваше перечисление следующим образом:

public enum Test
{
    None = 0,
    One = 1,
    Two = 2
}

Класс Enum имеет несколько удобных методов для работы с перечислениями, таких как IsDefined, чтобы выяснить, содержит ли переменная определенное значение перечисления.

2 голосов
/ 24 ноября 2011

Инициализируется по умолчанию для базового типа, который равен int, а default(int) равен 0.

1 голос
/ 24 ноября 2011

Базовым типом Enum является int тип по умолчанию, и значением по умолчанию, очевидно, является 0 (вы можете указать собственный базовый тип, но только примитивный числовой тип, например enum CustomEnum : byte)

1.10Перечисления, C # Спецификация:

Каждый тип перечисления имеет соответствующий целочисленный тип, называемый базовым типом типа перечисления.Тип enum, который явно не объявляет базовый тип, имеет базовый тип int.Формат хранения типа enum и диапазон возможных значений определяются его базовым типом.Набор значений, которые может принимать тип enum, не ограничен его членами enum.В частности, любое значение базового типа перечисления может быть приведено к типу перечисления и является отличным допустимым значением этого типа перечисления.

0 голосов
/ 24 ноября 2011

GetField принимает имя имени свойства , и вы передаете значение перечисления user.Flag

Вы должны написать

var value = (Test) typeof(Test).GetField("Flag").GetValue(user);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...