В C # возможно ли украсить тип Enum атрибутом или сделать что-то еще, чтобы указать, каким должно быть значение по умолчанию, без изменения значений? Необходимые числа могут быть установлены в камне по любой причине, и было бы удобно по-прежнему контролировать по умолчанию.
enum Orientation
{
None = -1,
North = 0,
East = 1,
South = 2,
West = 3
}
Orientation o; // Is 'North' by default.
int
s в аннотации не имеет смысла , просто потому, что они реализованы в виде числовых типов. Мы можем реализовать перечисления в виде строк, и это не изменит их полезность. Я считаю ответ здесь ограничением выразительности языка C #; ограничение, безусловно, не присуще идее «отличить ценности от ограниченного набора».enum
s как о конструкциях уровня типа, в частности, как о типах суммы (или посмотрите здесь . То есть рассматривайте каждое перечисление как отдельный тип, где все значения этого типа отличаются от значений всех остальных перечислений. Исходя из такого мышления, перечисления не могут разделить какое-либо значение, и, действительно, эта абстракция разваливается, если учесть, что значение по умолчанию0
может быть или не быть действительным для данного перечисления, и оно просто добавлено в каждое перечисление.Ответы:
Значение по умолчанию для
enum
(фактически любого типа значения) равно 0, даже если это недопустимое значениеenum
. Это не может быть изменено.источник
Значение по умолчанию любого перечисления равно нулю. Таким образом, если вы хотите установить один перечислитель в качестве значения по умолчанию, то установите для него значение нуля, а для всех остальных перечислителей - ненулевое значение (первый перечислитель с нулевым значением будет значением по умолчанию для этого перечисления, если существует несколько перечислителей). со значением ноль).
Если вашим перечислителям не нужны явные значения, просто убедитесь, что первым перечислителем является тот, который вы хотите использовать в качестве перечислителя по умолчанию, поскольку «по умолчанию первый перечислитель имеет значение 0, а значение каждого последующего перечислителя увеличивается на 1.» ( C # ссылка )
источник
Если ноль не работает как правильное значение по умолчанию, вы можете использовать модель компонента, чтобы определить обходной путь для перечисления:
и тогда вы можете позвонить:
Примечание: вам нужно будет добавить следующую строку вверху файла:
Это не меняет фактическое значение по умолчанию для языка C # перечисления, но дает возможность указать (и получить) желаемое значение по умолчанию.
источник
else
заявлении следующим образом :return default(TEnum);
. Во-первых, это уменьшит медленныеEnum.GetValues(...).***
вызовы, а во-вторых (и что более важно) будет общим для любого типа, даже не перечисляемых. Кроме того, вы не ограничиваете код, который будет использоваться только для перечислений, так что это фактически исправит потенциальные исключения при использовании над не перечислимыми типами.По умолчанию для перечисления используется любое перечисление, равное нулю. Я не верю, что это можно изменить с помощью атрибута или других средств.
(MSDN говорит: «Значение по умолчанию для перечисления E - это значение, полученное выражением (E) 0.»)
источник
Вы не можете, но если вы хотите, вы можете сделать трюк. :)
использование этой структуры в качестве простого перечисления.
где вы можете создать pa == Orientation.East (или любое другое значение) по умолчанию,
чтобы использовать сам трюк, вам нужно конвертировать из int с помощью кода.
есть реализация:
источник
value + 1
, иначе теперь вашdefault(Orientation)
возвратEast
. Кроме того, сделайте конструктор частным. Хороший подход.Еще один способ, который может быть полезен - использовать какой-то «псевдоним». Например:
источник
Status s = default(Status);
не будет ни одним из членов статуса, так какs
оно будет иметь значение(Staus) 0
. Последнее допустимо для прямой записи, поскольку перечисления могут быть преобразованы в целые числа, но при десериализации произойдет сбой, поскольку среда гарантирует, что перечисление всегда десериализовано для допустимого члена. Ваш код будет полностью действительным, если вы измените строкуNew = 10
наNew = 0
.На самом деле значение по
enum
умолчанию - это первый элемент вenum
чьём значении0
.Так, например:
источник
Console.WriteLine(Animals.Pony);
печатает «Кошка»)The default value of enum is the enummember equal to 0 or the first element(if value is not specified)
... Но я столкнулся с критическими проблемами, используя enum в своих проектах, и преодолел их, выполнив что-то ниже ... Как бы моя потребность не была связана с уровнем класса ...и получить ожидаемый результат
А что если значение поступает из БД ... Хорошо, в этом сценарии ... передайте значение в функцию ниже, и она преобразует значение в перечисление ... функция ниже обрабатывает различные сценарии, и это универсально ... и поверьте мне, это так очень быстро ..... :)
источник
Значением по умолчанию для типа перечисления является 0:
« По умолчанию первый перечислитель имеет значение 0, а значение каждого последующего перечислителя увеличивается на 1 ».
« Тип значения enum имеет значение, созданное выражением (E) 0, где E - идентификатор перечисления ».
Вы можете проверить документацию для перечисления C # здесь , а также документацию для таблицы значений C # по умолчанию здесь .
источник
Если вы определяете перечисление по умолчанию как перечисление с наименьшим значением, вы можете использовать это:
Это не предполагает, что перечисление имеет нулевое значение.
источник
По умолчанию это первый в определении. Например:
Это вернется
His
источник
Если для свойства установлено значение null, возвращаются значения Orientations.None при получении. Свойство _orientation по умолчанию имеет значение null.
источник
Тогда в коде вы можете использовать
источник