Question

Ceci est mon code:

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;
    }
}

Y a-t-il un moyen d'empêcher le casting?

Était-ce utile?

La solution

Sort of - convertissez m.Msg à la place:

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;
    }
}

La raison pour laquelle vous avez besoin de la distribution est que, en C #, les énumérations ne sont pas que des nombres - ce sont des nombres associés au type. Cela vous empêche de faire (sans casting):

HttpStatusCode status = someWindowsMessageFlag;

C’est clairement une bonne chose :) Lorsque vous en avez besoin, vous pouvez toujours vous connecter via "&"; le type sous-jacent (int dans ce cas).

Autres conseils

Qu'est-ce que Message.Msg est défini comme?

Je parie que c'est Int32.

Je parie également que WindowsMessagesFlags est votre type, mais Message provient du framework.

Ce qui signifie que vous utilisez votre propre énumération avec un objet construit dans la structure. Bien sûr, ils présenteront des incompatibilités concernant les types.

Une énumération est un type fort, pas seulement un nombre , mais un nombre portant un nom dans un contexte . Ce nom, ce contexte, ce nombre et cette partie ne sont pas directement compatibles avec les seuls chiffres. C’est pourquoi vous devez lancer des castes.

Une des raisons est que C # (4.0) ne vous permet pas d'écrire une surcharge d'opérateur implicite (un transt) dans une méthode d'extension ( question connexe ) pour tout type, y compris une énumération. Il serait bien de convertir proprement vers / depuis Int16 lors de l’intégration avec une base de données faiblement typée, par exemple, ou avec un format de sérialisation faiblement typé (graveur binaire).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top