Почему я должен приводить перечисления к int в C #?

Это мой код:

internal enum WindowsMessagesFlags {
    WM_EXITSIZEMOVE      = 0x00000232,
    WM_DISPLAYCHANGE     = 0x0000007e,
    WM_MOVING            = 0x00000216,
}

protected override void WndProc(ref Message m) {
    switch(m.Msg) {
        case (int)WindowsMessagesFlags.WM_DISPLAYCHANGE:
            FixWindowSnapping();
            break;
        case (int)WindowsMessagesFlags.WM_EXITSIZEMOVE:
            SaveWindowProperties();
            break;
        case (int)WindowsMessagesFlags.WM_MOVING:
            KeepProperLocation(ref m);
            break;
    }
}

Есть ли способ предотвратить кастинг?

9 голосов | спросил Ricardo Amaral 28 52008vEurope/Moscow11bEurope/MoscowFri, 28 Nov 2008 18:56:41 +0300 2008, 18:56:41

3 ответа


0

В некотором роде - вместо этого приведите m.Msg:

protected override void WndProc(ref Message m) {
    switch((WindowsMessagesFlags) m.Msg) {
        case WindowsMessagesFlags.WM_DISPLAYCHANGE:
                FixWindowSnapping();
                break;
        case WindowsMessagesFlags.WM_EXITSIZEMOVE:
                SaveWindowProperties();
                break;
        case WindowsMessagesFlags.WM_MOVING:
                KeepProperLocation(ref m);
                break;
    }
}

Причина, по которой вы вообще нуждаетесь в приведении, состоит в том, что в C # перечисления - это не просто числа - это числа, связанные с типом. Это мешает вам делать (без приведения):

HttpStatusCode status = someWindowsMessageFlag;

Это явно хорошая вещь :) Однако, когда вам нужно, вы всегда можете пройти «через» базовый тип (в данном случае int).

ответил Jon Skeet 28 52008vEurope/Moscow11bEurope/MoscowFri, 28 Nov 2008 18:58:49 +0300 2008, 18:58:49
0

Что такое Message.Msg?

Держу пари, это Int32.

Держу пари, что WindowsMessagesFlags - ваш тип, но Message - из фреймворка.

Это означает, что вы используете свой собственный enum со встроенным в фреймворк объектом, и, конечно, они будут иметь некоторые несовместимости в отношении типов.

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

ответил Lasse Vågsæther Karlsen 28 52008vEurope/Moscow11bEurope/MoscowFri, 28 Nov 2008 19:00:32 +0300 2008, 19:00:32
0

Одна из причин в том, что C # в настоящее время (4.0) не позволяет вам писать неявную перегрузку оператора (приведение) в методе расширения ( связанный вопрос ) для любого типа, включая перечисление. Было бы неплохо выполнить чистое преобразование в /из Int16 при интеграции, например, со слабо типизированной базой данных или со слабо типизированным форматом сериализации (бинарный модуль записи).

ответил crokusek 23 SunEurope/Moscow2012-12-23T11:43:31+04:00Europe/Moscow12bEurope/MoscowSun, 23 Dec 2012 11:43:31 +0400 2012, 11:43:31

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132