Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
skitale
3 / 4 / 1
Регистрация: 25.05.2012
Сообщений: 255
Записей в блоге: 1
1

Ошибка при работе с перечислением (исправить код)

22.02.2014, 14:16. Просмотров 406. Ответов 7
Метки нет (Все метки)

Вроде бы всё проще простого: создал тип-перечисление месяцев с указанием количества дней в месяце. Не могу теперь понять почему программа выдает разные результаты в двух случаях. Уже не знаю что может быть. Может я чего не понимаю? Подскажите, пожалуйста.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
 class Program
    {
        enum MonthTEST //тестовый тип-перечисление
        {
            january,// = 31,
            february,// = 28,
            march,// = 31,
            april,// = 30,
            may,// = 31,
            june,//= 30,
            july,//= 31,
            august,//= 31,
            september,// = 30,
            october,//= 31,
            november,//= 30,
            december,//= 31,
        }
        enum Month
        {
            january = 31,
            february = 28,
            march = 31,
            april = 30,
            may = 31,
            june = 30,
            july = 31,
            august = 31,
            september = 30,
            october = 31,
            november = 30,
            december = 31,
        }
        static void Main(string[] args)
        {
            Month month = Month.december; // задал месяц "декабрь"
            MonthTEST monthTest = MonthTEST.december; // задал месяц "декабрь"
            
            Console.WriteLine(month + " : " + (int) month); // july : 31 
            Console.WriteLine(monthTest + " : " + (int)monthTest); // december : 11
            Console.ReadKey();
        }
    }
Добавлено через 13 минут
Сори, само собой, перечисления определены в пространстве имен, а не в классе Program
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.02.2014, 14:16
Ответы с готовыми решениями:

Ошибка при работе с ArrayList (Обнаружен недостижимый код)
Что значит ошибка: Обнаружен недостижимый код? Вылезает на строке (подчеркивает myArrList): ...

Исправить ошибки при работе с потоками
Ребятушки-умники! нужна помошь, ошибки при написании, премного благодарна буду! using System;...

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

Исправить код: ошибка в конструкции if-else
Помогите у меня условие работает не правильно(... Срабатывает условие if и else вместе(... private...

Код выдает исключение 503 при работе с сайтом vk
Код выдает исключение 503, из за чего может происходить, может ли из-за многопоточности? private...

7
Psilon
Master of Orion
Эксперт .NET
6039 / 4893 / 903
Регистрация: 10.07.2011
Сообщений: 14,477
Записей в блоге: 5
Завершенные тесты: 4
22.02.2014, 18:23 2
потому что вы не понимаете, зачем нужны перечисления. Не для хранения констант, а для удобного именования, чтобы потом их обходить в switch case. надеюсь этот код поможет понять:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
  class Program
    {
        enum MonthTEST //тестовый тип-перечисление
        {
            january,// = 31,
            february,// = 28,
            march,// = 31,
            april,// = 30,
            may,// = 31,
            june,//= 30,
            july,//= 31,
            august,//= 31,
            september,// = 30,
            october,//= 31,
            november,//= 30,
            december,//= 31,
        }
        enum Month
        {
            january = 31,
            february = 28,
            march = 31,
            april = 30,
            may = 31,
            june = 30,
            july = 31,
            august = 31,
            september = 30,
            october = 31,
            november = 30,
            december = 31,
        }
        static void Main(string[] args)
        {
            PrintEnum(typeof(MonthTEST));
            PrintEnum(typeof(Month));
            Console.ReadKey();
        }
 
        private static void PrintEnum(Type type)
        {
            var enums = Enum.GetValues(type);
            foreach (var value in enums)
            {
                Console.WriteLine("Имя = {0}, значение = {1}", value, (int) value);
            }
            Console.WriteLine();
        }
    }
а для вашего случая нужно использовать словарь:
C#
1
2
3
4
5
        Dictionary<string,int> monthDictionary = new Dictionary<string, int>()
                                                 {
                                                     {"january", 31},
                                                     {"february", 28},...
                                                 };
Добавлено через 1 минуту
Как видите из второго случая, он будет путаться, все элементы перечисления будут считаться февралем, апрелем или июлем, в зависимости от числа дней, 28, 30 или 31.
0
kolorotur
Эксперт .NET
11885 / 9441 / 2412
Регистрация: 17.09.2011
Сообщений: 16,150
Завершенные тесты: 1
22.02.2014, 20:05 3
Цитата Сообщение от Psilon Посмотреть сообщение
для вашего случая нужно использовать словарь
Да там и словарь-то не нужен: первые семь месяцев по 30 дней в четных (если считать январь за 1), по 31 в нечетных.
С августа по декабрь — наоборот.
Февраль — особый случай, зависит от года.
0
rattrapper
foo();
871 / 573 / 222
Регистрация: 03.07.2013
Сообщений: 1,549
Записей в блоге: 2
22.02.2014, 20:32 4
skitale, поможет?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
static class Program
{
    static void Main(string[] args)
    {
        foreach (var e in Enum.GetValues(typeof(Monthes)))
            Console.WriteLine("{0} : {1}", e, GetDaysCount((Monthes)e));
        Console.ReadKey();
    }
    enum Monthes
    {
        january,// = 31,
        february,// = 28,
        march,// = 31,
        april,// = 30,
        may,// = 31,
        june,//= 30,
        july,//= 31,
        august,//= 31,
        september,// = 30,
        october,//= 31,
        november,//= 30,
        december//= 31,
    }
    static int GetDaysCount(Monthes month, bool leap = false)
    {
        int val = (int)month;
        if (val == 1)
            return leap ? 29 : 28;
        else return val > 6 ^ val % 2 == 0 ? 31 : 30;
    }
}
0
22.02.2014, 20:32
Psilon
Master of Orion
Эксперт .NET
6039 / 4893 / 903
Регистрация: 10.07.2011
Сообщений: 14,477
Записей в блоге: 5
Завершенные тесты: 4
22.02.2014, 21:25 5
Цитата Сообщение от kolorotur Посмотреть сообщение
Да там и словарь-то не нужен: первые семь месяцев по 30 дней в четных (если считать январь за 1), по 31 в нечетных.
С августа по декабрь — наоборот.
Февраль — особый случай, зависит от года.
в принципе тоже вариант, но по имени месяца так не получится...
0
kolorotur
Эксперт .NET
11885 / 9441 / 2412
Регистрация: 17.09.2011
Сообщений: 16,150
Завершенные тесты: 1
22.02.2014, 21:39 6
Цитата Сообщение от Psilon Посмотреть сообщение
по имени месяца так не получится
Так имя месяца же сидит в перечислении:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    enum Monthes
    {
        january
        february
        march
        april
        may
        june
        july
        august
        september
        october
        november
        december
    }
Каст в инт и дело в шляпе.
0
skitale
3 / 4 / 1
Регистрация: 25.05.2012
Сообщений: 255
Записей в блоге: 1
23.02.2014, 12:12  [ТС] 7
Цитата Сообщение от Psilon Посмотреть сообщение
вы не понимаете, зачем нужны перечисления.
А вот что в справке написано:
http://msdn.microsoft.com/ru-ru/library/cc138362(v=vs.100).aspx :

"Элементам списка перечислителя типа перечисления можно присвоить любые значения, и можно также использовать вычисленные значения:
C#

enum MachineState
{
PowerOff = 0,
Running = 5,
Sleeping = 10,
Hibernating = Sleeping + 5
}"

У меня вопрос почему в моем случае получается разный результат. Константы обязательно должны быть в возрастающем на 1 порядке? И не должно быть повторяющихся?
0
Psilon
Master of Orion
Эксперт .NET
6039 / 4893 / 903
Регистрация: 10.07.2011
Сообщений: 14,477
Записей в блоге: 5
Завершенные тесты: 4
23.02.2014, 13:25 8
skitale, по идее они как раз и нужны для словесного обозначения цифровых констант. Чтобы вы не парились
C#
1
string.Split(';', 1); //почему 1, а не 2 3 или 100500?
а видели, что на самом деле
C#
1
string.Split(';', StringSplitOptions.RemoveEmptyEntries); //аа, ну теперь все понятно
Логично, что в обратную сторону это не работает, то есть вы пытаетесь сопоставить не числу слово, а слову(месяцу года) - число (дней в месяце). А вот это уже неправильно.
Элементам списка перечислителя типа перечисления можно присвоить любые значения, и можно также использовать вычисленные значения:
можно не значит нужно. Тем более, что обычно эти свойства (вычисляемость и задавание конкретных значений) используется для таких объявлений:
C#
1
2
3
4
5
6
7
8
9
10
11
    [Flags]
    public enum MyEnum
    {
        A = 1,
        B = 2,
        C = 4,
        D = 8,
        E = 0x10,
        F = 1 << 5,
        G = 1 << 6
    }
1
23.02.2014, 13:25
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.02.2014, 13:25

Ошибка 424 при работе с БД. Исправить код
Dim db As Database Set db = CurrentDb Dim rstSells As DAO.Recordset Dim rstPhone As...

Математические функции при работе с треугольником и прямоугольником: исправить код
#include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; int main() { double...

Ошибка при работе с вектором в list. Код -1073741819
Здравствуйте. Не могу понять в чем дело. Во время выполнения программы выползают ошибки, при чем...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru