2008-11-28 36 views
8

Đây là mã của tôi:Tại sao tôi phải cast enums vào int trong 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; 
    } 
} 

Có cách nào để ngăn chặn quá trình truyền không?

Trả lời

25

Sắp xếp của - cast m.Msg thay vì:

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

Lý do bạn cần các diễn viên ở tất cả là vì trong C# enums không chỉ số - chúng con số liên quan đến các loại. Điều này ngăn bạn thực hiện (không cần truyền):

HttpStatusCode status = someWindowsMessageFlag; 

Đây rõ ràng là điều tốt :) Khi bạn cần, bạn luôn có thể "qua" loại cơ bản (int trong trường hợp này).

2

Message.Msg được định nghĩa là gì?

Tôi đặt cược là Int32.

Tôi cũng đặt cược WindowsMessagesFlags là loại của bạn, nhưng Thư là từ khung công tác.

Điều đó có nghĩa là bạn đang sử dụng enum của riêng bạn với đối tượng được tạo khung và tất nhiên họ sẽ có một số không tương thích về các loại.

Enum là loại mạnh, không chỉ một số, đó là số có tên trong ngữ cảnh. Tên, ngữ cảnh, số, phần này không tương thích trực tiếp với chỉ các số, và đó là lý do tại sao bạn cần truyền.

0

Một lý do là vì C# hiện tại (4.0) không cho phép bạn viết một toán tử ngầm quá tải (một diễn viên) trong một phương pháp mở rộng (related question) cho bất kỳ loại nào bao gồm một điều tra. Nó sẽ được tốt đẹp để sạch chuyển đổi sang/từ Int16 khi tích hợp với một cơ sở dữ liệu gõ yếu hoặc ví dụ hoặc một định dạng serialization yếu gõ (binary writer).

Các vấn đề liên quan