С#: Почему требуется преобразование из Enum в INT при использовании в инструкции switch?, перечисления - ints

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

        switch (Convert.ToInt32(uxView.SelectedValue))
        {
            case (int)ViewBy.Client:

Если я удаляю cast (int), он терпит неудачу и говорит, что я должен использовать cast.

Вот мое перечисление, и перечисления - это ints.... кто-нибудь знает об этом?

    public enum ViewBy
    {
        Client,
        Customer
    }

Ответы

Ответ 1

В С# enum указаны не только числа. Скорее, это числа, связанные с типом или номером с именем в контексте.

Чтобы избежать приведения в операторы case, вы можете сделать бросок в switch:

switch((ViewBy)Convert.ToInt32(uxView.SelectedValue))

Это, однако, имеет свои проблемы. Например, этот фрагмент кода выведет на консоль 7.

enum ViewBy
{
    ChuckNorris = 1,
    JamesBond
}

Console.WriteLine((ViewBy)7);

Ответ 2

Вы должны преобразовать свое строковое значение в enum, используя Enum.Parse.

ViewBy selected = (ViewBy) Enum.Parse(typeof(ViewBy), uxView.SelectedValue);        
switch (selected)
{
    case ViewBy.Client:
    // etc.
}

Кроме того, базовый тип для перечисления необязательно должен быть Int32.

Ответ 3

Enums НЕ ints в .NET-системе!
Структура хранит их с помощью дискретных целых значений - это другая вещь...

Томас

Ответ 4

Из MSDN:

switch ( expression )
      case constant-expression : statement
   [default  : statement]

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

Нет никакого неявного преобразования из enum в int, поэтому для каждого вашего case требуется явное преобразование. Обратите внимание, однако, что первоначальное включение выражения правильного типа имело бы больше смысла, чем листинг каждого случая (см. Enum.Parse).

Ответ 5

Я предполагаю, что в этом случае выглядит вроде хромой, имея преобразование для int и всех.

Предположим, что вы передали int, а не перечисление, этому методу, помните:

  • Вы собираетесь документировать это достаточно хорошо, чтобы в любое время и в будущем вы могли исправить или улучшить систему?
  • Это перечисление не используется в другом месте? (Образец о том, как бороться с той же информацией, является ключом к тому, чтобы не делать ошибки юниоров или проигрывать себя.)

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

И btw, проще конвертировать в int и сопоставлять его с другим int, чем строка, например.

Ответ 6

В ответ на вопрос "Может ли кто-нибудь сказать мне, почему мне нужно отбрасывать Int из моего перечисления"....

Вы должны отличить целое число, потому что значения Enums не являются целыми числами. Перечисления имеют базовое значение, которое может быть сохранено как целостный тип (по умолчанию int).

Вы можете определить базовый тип с помощью

Enum.GetUnderlyingType( typeof(ViewBy) );

Вы можете найти более подробную информацию здесь и здесь

Ответ 7

Зачем вам вообще нужно бросать в int? Если uxView.SelectedValue является перечислением ViewBy, тогда просто (ViewBy) uxView.SelectedValue будет достаточно прав?