Как переменная, типизированная как enum, может принимать значение, выходящее за пределы диапазона ее элементов? - PullRequest
5 голосов
/ 18 апреля 2011

Может кто-нибудь объяснить мне, как член этого перечисления принимает значение 0?

public enum EnumLogicalOperator
{
    And = 1,
    Or = 2
}

enter image description here


enter image description here


enter image description here

Ответы [ 8 ]

5 голосов
/ 18 апреля 2011

Всякий раз, когда вы используете default(EnumLogicalOperator) или new EnumLogicalOperator(), вы получите нулевое значение. Другими словами, значение по умолчанию члена типа enum всегда равно 0. Все перечисления будут иметь значение 0, пока вы не установите их в другое значение.

4 голосов
/ 18 апреля 2011

На этой странице упоминается: http://msdn.microsoft.com/en-us/library/sbbt4032%28v=vs.80%29.aspx

Значением по умолчанию для перечисления E является значение, полученное выражением (E) 0

Таким образом, по умолчанию значение по умолчанию будет всегда быть целочисленным значением 0. Итак, я предполагаю, что у вас есть то, что LogicalOperatorWithPreviousRule никогда не присваивается значение.

4 голосов
/ 18 апреля 2011

Значение по умолчанию для перечисления 0;Я полагаю, что стандартная рекомендация заключается в том, что вы всегда включаете в свой список что-то, назначенное для 0, чтобы учесть это ("Неизвестно" или "Нет", оба работают хорошо в моем опыте).

4 голосов
/ 18 апреля 2011

Экземпляр типа enum может быть создан из любого допустимого значения его базового типа, даже если с этим базовым значением не связан ни один именованный член перечисления.В частности, обычно можно увидеть значение 0, потому что:

  1. Это значение по умолчанию для типов перечисления.
  2. Для удобства C # позволяет неявно преобразовывать литерал 0 к любому типу перечисления.
3 голосов
/ 18 апреля 2011

Перечисление может иметь любое значение в зависимости от его базового типа (в вашем случае Int32).

EnumLogicalOperator op = (EnumLogicalOperator) 0;
EnumLogicalOperator op = (EnumLogicalOperator) 100;
EnumLogicalOperator op = (EnumLogicalOperator) 900000;
EnumLogicalOperator op = (EnumLogicalOperator) -1;

private EnumLogicalOperator _op; // As a class member, will default to 0

Обязательно используйте Enum.IsDefined , когдапроверка вашего ввода и обработки ошибок.Также, как правило, рекомендуется указывать 0 в качестве значения для одного из значений перечисления.

3 голосов
/ 18 апреля 2011

Из спецификации языка C # (раздел 1.10, Enums ):

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

Кроме того, раздел 4.1.2, Конструкторы по умолчанию указывает, что перечисление по умолчанию равно 0.

Загрузите документ, он содержит много интересной информации: -)

3 голосов
/ 18 апреля 2011

Значение по умолчанию для целочисленной переменной равно 0. И поскольку базовый тип по умолчанию для каждого элемента перечисления - int, представляющий целое число, значением по умолчанию для вашей переменной будет 0.

Документация делает это явным:

Значение по умолчанию для перечисления E - это значение, полученное выражением (E) 0.


Единственный способ получить другое значение по умолчанию - это явная инициализация его при объявлении переменной:

EnumLogicalOperator x = EnumLogicalOperator.Or;

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


Кроме того, можно присвоить любое произвольное целочисленное значениепеременной, типизированной как enum. документация предупреждает:

Можно назначить любое произвольное целочисленное значение для meetingDay.Например, эта строка кода не выдает ошибку: meetingDay = (Days) 42. Однако не следует этого делать, поскольку неявное ожидание состоит в том, что переменная enum будет содержать только одно из значений, определенных перечислением.Присвоение произвольного значения переменной типа перечисления означает высокий риск ошибок.

И это еще яснее в Спецификации языка C # (в частности, в разделе 1.10 о перечислениях):

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

Именно поэтому очень важно, чтобы методы общедоступной платформы всегдаубедитесь, что указанное значение находится в диапазоне допустимых значений для этого перечисления.Вы не можете полагаться на систему проверки типов, чтобы гарантировать это для вас.Руководство по проектированию платформы рекомендует:

Выполнить проверку аргументов.Не предполагайте, что аргументы перечисления будут в определенном диапазоне.Допустимо преобразовывать любое целое число в перечисление, даже если оно не определено в перечислении.

0 голосов
/ 18 апреля 2011

Я бы посоветовал вам включить элемент «Не определено» со значением 0 или сделать «И» или «Или» значением 0.

...