C#で列挙型をintにキャストする必要があるのはなぜですか?
質問
これは私のコードです:
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;
}
}
とにかくキャストを防ぐ方法はありますか?
解決
のソート-代わりに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もあなたのタイプですが、Messageはフレームワークのものです。
これは、フレームワークで構築されたオブジェクトで独自の列挙型を使用していることを意味し、もちろん、型に関していくつかの非互換性があります。
enumは、数字だけでなく、強い型であり、コンテキスト内の名前を持つ数字です。この名前、コンテキスト、数字、パートは数字だけとは直接互換性がないため、キャストする必要があります。
1つの理由は、C#(4.0)では拡張メソッド内で暗黙的な演算子オーバーロード(キャスト)を記述できないためです(関連する質問)列挙を含む任意のタイプ。たとえば、弱い型付けのデータベースまたは弱い型付けのシリアル化形式(バイナリライター)と統合する場合は、Int16との間で完全に変換するとよいでしょう。
所属していません StackOverflow