Почему мне нужно приводить перечисления к 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;
    }
}

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
9
0
9 026
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Типа - вместо 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).

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

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

Я также держу пари, что WindowsMessagesFlags - это ваш тип, но сообщение - из фреймворка.

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

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

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

Другие вопросы по теме