9

これは私のコードです:

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

とにかくキャストを防ぐ方法はありますか?

4

3 に答える 3

26

並べ替え - 代わりに 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)を「経由」できます。

于 2008-11-28T15:58:49.247 に答える
3

Message.Msg は何と定義されていますか?

Int32 だと思います。

また、WindowsMessagesFlags があなたのタイプであると確信していますが、Message はフレームワークからのものです。

これは、フレームワークで構築されたオブジェクトで独自の列挙型を使用していることを意味します。もちろん、型に関していくつかの非互換性があります。

列挙型は強力な型であり、単なる数値ではなく、コンテキスト内の名前を持つ数値です。この名前、コンテキスト、番号、部分は、数字だけと直接互換性がないため、キャストする必要があります。

于 2008-11-28T16:00:32.503 に答える
0

理由の 1 つは、現在 (4.0) の C#では、列挙型を含む任意の型の拡張メソッド (関連する質問)内に暗黙的な演算子のオーバーロード (キャスト) を記述できないためです。たとえば、弱く型付けされたデータベースまたは弱く型付けされたシリアル化形式 (バイナリ ライター) と統合する場合は、Int16 との間できれいに変換するとよいでしょう。

于 2012-12-23T07:43:31.270 に答える