c #: Почему приведение требуется от Enum к INT при использовании в операторе switch?, перечисления являются целыми числами - PullRequest
16 голосов
/ 19 ноября 2010

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

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

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

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

    public enum ViewBy
    {
        Client,
        Customer
    }

Ответы [ 7 ]

10 голосов
/ 19 ноября 2010

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

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

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

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

enum ViewBy
{
    ChuckNorris = 1,
    JamesBond
}

Console.WriteLine((ViewBy)7);
4 голосов
/ 19 ноября 2010

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

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

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

2 голосов
/ 19 ноября 2010

С MSDN :

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

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

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

2 голосов
/ 19 ноября 2010

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

Thomas

0 голосов
/ 19 ноября 2010

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

0 голосов
/ 19 ноября 2010

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

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

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

Enum.GetUnderlyingType( typeof(ViewBy) );

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

0 голосов
/ 19 ноября 2010

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

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

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

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

И, кстати, проще преобразовать в int и сравнить его с другим int, чем со строкой, например.

...