C # Перечисления и кастинг - PullRequest
7 голосов
/ 11 марта 2009

Если вы объявляете enum в C #, типом по умолчанию будет автоматически int.

Так почему же в операторе case или в других случаях при использовании enum вам необходимо явно переделывать, чтобы использовать значения? Какой смысл иметь базовый тип, если вам нужно явно указать случай, или я просто что-то здесь не так делаю?

private enum MyEnum
        {
            Value1,
            Value2,
            Value3
        }

    switch (somevalue)
                {
                    case (int)MyEnum.Value1:
                        someothervar = "ss";
                        break;
                    case (int)MyEnum.Value2:
                        someothervar = "yy";
                        break;
                    case (int)MyEnum.Value3:
                        someothervar = "gg";
                        break;
                }

Ответы [ 4 ]

15 голосов
/ 11 марта 2009

Каков тип somevalue? Если типом является MyEnum, приведение не требуется и должно работать без ошибок.

Если тип int, то да, вам придется привести к MyEnum, чтобы правильно переключить / case. Но вы можете сделать это немного проще, приводя значение вместо каждого оператора case. Например

switch( (MyEnum)somevalue )  {
  case MyEnum.Value1: ...
}
4 голосов
/ 11 марта 2009

Очевидно, что somevalue является целым числом, а не явно напечатано как ваше перечисление. Следует помнить, что базовое значение перечисления является просто «типом хранения» и не является неявно взаимозаменяемым. Однако вы можете легко использовать оператор приведения, чтобы сделать ваш код простым и безопасным для типов:

private enum MyEnum { Value1, Value2, Value3 }

switch ((MyEnum)somevalue)
{
    case MyEnum.Value1:
        someothervar = "ss";
        break;
    case MyEnum.Value2:
        someothervar = "yy";
        break;
    case MyEnum.Value3:
        someothervar = "gg";
        break;
    default:
        throw new NotSupportedException();
}

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

2 голосов
/ 11 марта 2009

Если somevalue имеет тип MyEnum, вам не нужно приводить к int.

public enum Color
{
    Red,
    Blue,
    Green
}

class Program
{
    static void Main(string[] args)
    {
        Color color = Color.Red;

        switch (color)
        {
            case Color.Red:
                break;

            case Color.Blue:
                break;

            case Color.Green:
                break;
        }
    }
}
1 голос
/ 11 марта 2009

Как говорили другие:

  • Если значение имеет тип MyEnum, вы не должен кастовать.
  • Если вы читаете из базы данных или текстовый файл, вы можете использовать enum Метод Parse, чтобы получить значение enum из строки.
  • Если вам абсолютно необходимо сравнить int, более эффективно использовать переключение на MyEnum, а не приведите каждое значение MyEnum к int.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...